Alb*_*Alb 35 java syntax multithreading
如果在类中我有一个ConcurrentHashMap实例,它将被多个线程修改和读取,我可能会这样定义:
public class My Class {
private volatile ConcurrentHashMap<String,String> myMap = new ConcurrentHashMap<String,String>();
...
}
Run Code Online (Sandbox Code Playgroud)
添加final到myMap字段会导致错误,说我只能使用final或volatile.为什么不能两者兼而有之?
Mic*_*rdt 29
volatile仅与变量本身的修改有关,而与其引用的对象无关.拥有一个final volatile字段是没有意义的,因为无法修改最终字段.只要声明该字段final,它应该没问题.
Vic*_*kin 27
这是因为Java内存模型(JMM).
基本上,当你声明对象字段时,final你需要在对象的构造函数中初始化它,然后final字段不会改变它的值.并且JMM承诺在ctor完成之后,任何线程都将看到相同(正确)的final字段值.因此,您不需要使用显式同步,例如synchronize或Lock允许所有线程看到正确的final字段值.
当您声明对象的字段时volatile,字段的值可以更改,但是仍然从任何线程读取的每个值都会看到写入它的最新值.
所以,final与volatile实现相同的目的-对象的字段值的可视性,但是第一具体用于可变可以仅被分配给一次和第二用于可以改变许多次的变量.
参考文献:
| 归档时间: |
|
| 查看次数: |
9897 次 |
| 最近记录: |