假设你有这样的代码:
private Object lockObject = new Object();
private Integer myValue = new Integer(0);
public void update(){
synchronized(lockObject){
System.out.println(myValue);
myValue++;
}
}
现在,myValue
既不是synchronized
on,也没有标记为volatile
。但是,改变它的唯一方法是使用update()
方法。DZone's refcard on core java concurrency表示,所有线程都可以看到对同步块中字段的更新。我不确定这是指仅同步的对象(lockObject)还是任何字段(如myValue)。
有没有人能详细说明一下?谢谢!
发布于 2012-04-11 20:26:54
synchronized块中的所有字段更新都保证对其他线程可见,只要它们在读取之前还在同一对象上同步。只要同步对共享可变状态的所有访问,就应该看到所有更新。
或者,如果您真的只有一个计数器,请使用AtomicInteger
:)
发布于 2012-04-11 20:38:20
考虑一下:
在synchronized块内执行System.out.println(myValue);
的
System.out.println(myValue);
增量之前执行Thread1的当前值myValue
将获得与步骤1中相同的myValue
值。在执行System.out.println(myValue);
的同步block.myValue
可能会获得由线程1设置的myValue
的新值。https://stackoverflow.com/questions/10113388
复制相似问题