Java ConcurrentHashMap的线程内存管理
我的疑问是HashTable get()方法是同步读取的。但是ConcurrentHashMap的这一限制已被删除。但是,只有同步块才能从内存访问最新的值。如果是这样的话,如果其他线程更新了最新的值,然后在本地缓存了该值,那么它将访问该值。它是如何做到这一点的。 此外,可重入锁还可以从内存中获取和更新最新的值,如同步块。 感谢的javadoc在以下方面非常清楚: 检索反映最近完成的更新的结果 手术一开始就进行。(更正式地说,是更新 给定键的操作在与任何 (非空)检索报告更新值的键。) “before”文本专门指java的行为 但是,只有同步块才能从内存访问最新值Java ConcurrentHashMap的线程内存管理,java,multithreading,Java,Multithreading,我的疑问是HashTable get()方法是同步读取的。但是ConcurrentHashMap的这一限制已被删除。但是,只有同步块才能从内存访问最新的值。如果是这样的话,如果其他线程更新了最新的值,然后在本地缓存了该值,那么它将访问该值。它是如何做到这一点的。 此外,可重入锁还可以从内存中获取和更新最新的值,如同步块。 感谢的javadoc在以下方面非常清楚: 检索反映最近完成的更新的结果 手术一开始就进行。(更正式地说,是更新 给定键的操作在与任何 (非空)检索报告更新值的键。) “befo
你错了:
volatile
读取访问最新值而不锁定。更一般地说,最重要的关注点是Java内存模型定义的写与读之间的关系是否在建立之前发生ConcurrentHashMap
使用volatile
变量来保证以前发生过的事情。您的基本问题是java.util.concurrent库是否提供内存一致性保证?是的。听起来可能很傻。但我没有读到它的任何地方。因此,只要确认一下就可以了。检查一下接口ConcurrentMap的javadoc是的。无论您使用的是锁定还是同步块,这将保证您看到最新的更新值。谢谢。另外,我的观点是,它如何在不同步或锁定读取操作的情况下获取最新的值。我的意思是内部使用的机制是什么?@HariJustForFun源代码包含在JDK中,你可以研究一下。这是一个打字错误。我的意思是两种情况中的一种,即同步和不同步。但是非常感谢你的回答。有道理。