3

假设您有以下代码:

private Object lockObject = new Object();
private Integer myValue = new Integer(0);

public void update(){
 synchronized(lockObject){
  System.out.println(myValue);
  myValue++;
 }
}

现在,myValue既没有synchronized开启也没有标记volatile。但是,改变它的唯一方法是使用update()方法。DZone在核心 java 并发上的 refcard 说,所有线程都可以看到对同步块中的字段的更新。我不确定这是否意味着仅同步对象(lockObject)或任何字段(如 myValue)。

谁能详细说明这一点?谢谢!

4

2 回答 2

8

同步块中的所有字段更新都保证对其他线程可见,只要它们在读取之前也在同一个对象上同步。只要您同步所有对共享可变状态的访问,您应该会看到所有更新。

或者,如果你真的只有一个柜台,使用AtomicInteger:)

于 2012-04-11T20:26:53.593 回答
0

考虑:

  1. 在同步块内执行的 Thread1System.out.println(myValue);输出 的当前值myValue

  2. 在Thread1递增System.out.println(myValue); 之前myValue执行的 Thread2将获得与myValue步骤 1 中相同的值。

  3. Thread1myValue在同步块内递增。

  4. Thread2 执行System.out.println(myValue); 可能会得到 Thread1 设置的新值myValue

于 2012-04-11T20:38:20.247 回答