Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 线程安全代码_Java_Thread Safety - Fatal编程技术网

Java 线程安全代码

Java 线程安全代码,java,thread-safety,Java,Thread Safety,在并发arraylist或并发map(称之为MainMap)上执行get操作,并使用相同的索引对其进行写入/更新,这仍然是一个线程老化操作。正确的答案是线程安全性1取决于MainMap的类型以及其他线程如何使用它 如果mainMap是一个并发映射,它将是安全的 如果mainMap已安全发布并有效地 不变的 否则,它不是线程安全的 仅说在当前线程读取它的同时没有任何其他内容更新它是不够的。你必须考虑内存模型。 更新 额外的代码告诉我们,代码不会出现低级别内存异常。它是否严格线程安全取决于操

在并发arraylist或并发map(称之为MainMap)上执行get操作,并使用相同的索引对其进行写入/更新,这仍然是一个线程老化操作。正确的答案是线程安全性1取决于
MainMap的类型以及其他线程如何使用它

  • 如果
    mainMap
    是一个并发映射,它将是安全的

  • 如果
    mainMap
    已安全发布并有效地 不变的

  • 否则,它不是线程安全的


仅说在当前线程读取它的同时没有任何其他内容更新它是不够的。你必须考虑内存模型。


更新

额外的代码告诉我们,代码不会出现低级别内存异常。它是否严格线程安全取决于操作的预期语义的精确规范

问题是您正在两个不同的数据结构上执行原子操作。原子操作序列不一定是原子的。这是否重要取决于您期望getValue和setValue方法的行为



1-线程安全的经典定义是,线程安全程序是一个根据语言(或语言实现)多线程执行模型的语义所允许的所有执行的规范进行操作的程序。如您所见,它假定程序本身有某种规格。

这取决于在代码的其他部分如何修改映射。但是,您不应该有一个映射的映射,而应该有一个映射,其密钥类型是一对字符串。@JBNizet这是个好主意。我更新了上面的代码以反映修改的部分。如果有人正在更新另一个线程正在从getMyValue访问的相同值,这是一个问题吗?我不确定ConcurrentHashmap是否正在解决问题this@JBNizet顺便说一句,如果我需要知道Key1拥有的所有值,那么你的建议就行不通了。对吧?不,的确。这将是保留您的设计的一个很好的理由。对,但是您如何处理它会影响答案。回答这个问题的一种方法是检查它是否为null,如果为null,则创建一个新映射并将其放入mainMap。他们会给你留下一个比赛条件。我更新了上面的代码,以反映它被修改的地方。我假设因为Main是concurrentMap,所以一切都很好。但从您的回答来看,这似乎不是线程安全的,因为一个可以更新对象,而另一个可以跨两种不同的方法读取。如果是真的,那么如何使上面的示例成为线程安全的。嗯,我关心的是以下几点。假设thread1正在处理重载的toString方法(表示正在执行字节读取/转换)。与此同时,thread2正在执行更新同一对象的putValue。这会导致问题吗?如果是,如何避免这一问题?我无法访问对象a的类(我只能更改上面的类)。您的代码足以保证
getMyValue
调用将看到“旧”值或“新”值。但是如果
getMyValue
updateMyValue
调用在时间上重叠,我们无法确定它将看到哪一个。谢谢。对我来说没问题。我只是想确保我没有遇到并发异常。但是,如果一个线程从mainMap获取对象并正在处理它,而另一个线程通过用另一个对象替换该对象来更新mainMap。既然thread1处理了一半旧对象和一半新对象,并且得到了异常,那么它现在不是在处理损坏的对象吗?抱歉,如果我在这里使用了错误的术语