dsa*_*ish 10 java synchronization
假设我在synchronized方法中更新了两个变量的值.在退出synchronized块之前,同步方法中设置的新值是否可能对其他线程可见?
public synchronized void setValues(){
a=5;
// assume thread is preempted after this assignment
// would the value 5 be visible to other threads?
// my understanding is that the values will not be flushed to
// main memory until the lock is released- i.e., until the synchronized
// method is complete. So the changes will not be visible to other
// threads even when not using synchronization
b=10;
}
Run Code Online (Sandbox Code Playgroud)
下面的方法不同步,所以我理解该线程可能会 看到陈旧的值.我的问题是,如果线程在分配给a之后被抢占,那么变量a的新值"5"是否可能在printValues方法中可见?
public void printValues() {
System.out.println(a + " " + b);
}
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 14
是的,在到达synchronized块的末尾之前,在synchronized can(但不保证)内进行的更改是可见的.基本上,您通常需要在读取或写入数据时同步(在同一个锁上),以便获得一致的世界视图.
提供同步的保证是使"做正确的事"(适当地同步)正常工作-他们不保证改变原子制成,当你没有做正确的事(观察共享变量不同步).
您可以(在某种程度上)将同步块内的写入视为与调用OutputStream.write()同步块的退出就像flush()调用一样.当你在块的一半时,你写的一些数据可能已经输出到输出文件(或其他任何东西) - 但它仍然可以被缓冲.这并不意味着如何实现内存模型,只是为了帮助您了解如何保证可见性.