在并发程序,这是安全的:getter上的volatile和setter上的同步与synchronized上的同步?
private volatile int i;
public int getI() {
return i;
}
public synchronized incrementI() {
i++;
}
?
根据我所了解的synchronize
,只有在获取同一对象上的锁定监视器的线程上,才能保证在i
上可用的更改。 所以我认为,上面的代码是不安全的。请确认是否属实,否则请说明。 谢谢。
不幸的是,这个答案不正确。 “同步方法内部的更改都不会传递到所有线程”,也不会“如果您使其变为易失性,所有线程都不会将其缓存”。这是一个正确的答案:http://stackoverflow.com/a/29446437/2613885 – 2015-04-04 12:32:46
@AlekseyShipilev如果你不使变量易变,那么单独的线程缓存其堆栈中的值。还更新同步块中的变量,并更新其存储它的所有线程中的值。你同意吗?你所说的最终会导致这种情况。那么如何来回答是错误的。 – Lokesh 2015-04-04 13:17:44
看到这篇文章:http://www.javamex.com/tutorials/synchronization_volatile.shtml – Lokesh 2015-04-04 13:18:59