Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 ConcurrentHashMap的线程内存管理_Java_Multithreading - Fatal编程技术网

Java ConcurrentHashMap的线程内存管理

Java ConcurrentHashMap的线程内存管理,java,multithreading,Java,Multithreading,我的疑问是HashTable get()方法是同步读取的。但是ConcurrentHashMap的这一限制已被删除。但是,只有同步块才能从内存访问最新的值。如果是这样的话,如果其他线程更新了最新的值,然后在本地缓存了该值,那么它将访问该值。它是如何做到这一点的。 此外,可重入锁还可以从内存中获取和更新最新的值,如同步块。 感谢的javadoc在以下方面非常清楚: 检索反映最近完成的更新的结果 手术一开始就进行。(更正式地说,是更新 给定键的操作在与任何 (非空)检索报告更新值的键。) “befo

我的疑问是HashTable get()方法是同步读取的。但是ConcurrentHashMap的这一限制已被删除。但是,只有同步块才能从内存访问最新的值。如果是这样的话,如果其他线程更新了最新的值,然后在本地缓存了该值,那么它将访问该值。它是如何做到这一点的。 此外,可重入锁还可以从内存中获取和更新最新的值,如同步块。 感谢

的javadoc在以下方面非常清楚:

检索反映最近完成的更新的结果 手术一开始就进行。(更正式地说,是更新 给定键的操作在与任何 (非空)检索报告更新值的键。)

“before”文本专门指java的行为

但是,只有同步块才能从内存访问最新值


你错了:
volatile
读取访问最新值而不锁定。更一般地说,最重要的关注点是Java内存模型定义的写与读之间的关系是否在建立之前发生
ConcurrentHashMap
使用
volatile
变量来保证以前发生过的事情。

您的基本问题是java.util.concurrent库是否提供内存一致性保证?是的。听起来可能很傻。但我没有读到它的任何地方。因此,只要确认一下就可以了。检查一下接口ConcurrentMap的javadoc是的。无论您使用的是锁定还是同步块,这将保证您看到最新的更新值。谢谢。另外,我的观点是,它如何在不同步或锁定读取操作的情况下获取最新的值。我的意思是内部使用的机制是什么?@HariJustForFun源代码包含在JDK中,你可以研究一下。这是一个打字错误。我的意思是两种情况中的一种,即同步和不同步。但是非常感谢你的回答。有道理。