AKS*_*AKS 2 java collections multithreading concurrenthashmap java.util.concurrent
我正在浏览ConcurrentHashMapjdk 7中的源代码并且几乎没有问题.我已经在StackOverFlow上完成了有关CHM的所有问题,但找不到答案.
get()CHM中的操作是否保证put()由其他线程获得正确的值?我问这是因为get不是,synchronized除非它看到null值.null值如何确保其他线程正在更新相同的记录然后get与lock一起使用?
这与HashEntry存储键和值的静态类有关.
一个.为什么这堂课最后?它只是为了确保没有人对它进行子类化吗?如果有人将其子类化,会发生什么 - 这有什么问题?
湾 如何使下一个字段最终有助于获得线程安全?
C.为什么Key也是最终的?(我不确定为什么Key也是最终的HashMap)
CHM中的get操作是否保证得到其他线程的正确值?
只要put()在通话之前完成,它肯定是有保证的get().CHM在volatile内部使用访问和其他锁来确保数据同步,而不一定是synchronized关键字.
我问这是因为get不是同步的,除非它看到null值.null值如何确保其他线程正在更新相同的记录然后get与lock一起使用?
我假设你指的是这个javadoc:
因为值字段是易失性的,而不是最终的,所以对于非同步读取器,Java内存模型在通过数据争用读取时看到null而不是初始值是合法的.尽管实际上不可能实现重新排序,但是如果在非同步访问方法中看到null(预初始化)值,则将Segment.readValueUnderLock方法用作备份.
这是试图解释该值不是最终的,因此构造函数中的初始化可以重新排序,读者可以看到空值.我假设这就是为什么不允许CHM存储空值的原因.这允许他们测试null然后做另一个进入synchronized块内.
有关重新排序的构造函数的更多信息,请参阅:是否可以重新排序实例初始化和分配给共享变量?
为什么
HashEntry班级最后?它只是为了确保没有人对它进行子类化吗?
是.这确保了类不能被子类化.这确保了不变性.如果有人将其子类化,则可以更改字段的可见性并中断并发协议.
如何使下一个[[field]] final有助于获得线程安全性?
该next场(还有key和hash字段)是final因为这将确保该字段在构造完全初始化.这确实提高了线程安全性,因为优化器不能在构造函数结束之后重新排序初始化,并且保证所有线程都能看到数据.
参见上述有关信息value领域,以及他们如何防范它不被final允许put(...)覆盖.
为什么Key也是最终的?(我不确定为什么Key也是HashMap中的最终版)
答案与答案相同HashEntry.
| 归档时间: |
|
| 查看次数: |
1012 次 |
| 最近记录: |