繁体   English   中英

Java Concurrency规范?:是否对所有线程都可见的同步块内的字段进行了更新?

[英]Java Concurrency spec ?: Is an update to a field inside a synchronized block visible to all threads?

说你有这个代码:

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)。

任何人都可以详细说明这个吗? 谢谢!

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

或者,如果您真的只有一个计数器,请使用AtomicInteger :)

考虑:

  1. System.out.println(myValue);执行System.out.println(myValue); 在synchronized块内输出myValue的当前值。

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

  3. myValue在synchronized块中增加myValue

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM