我在许多帖子中读过,认为这使得代码在某种程度上是线程安全的,因此应该从代码中删除System.out.println()
模拟比赛。System.out.println()
现在同步write()
方法在写入流之前进行,所以每次调用都会持有并释放一个锁。PrintStream
this
write()
write()
PrintStream 方法
public void write(int b) {
try {
synchronized (this) { //acquires a lock
ensureOpen();
out.write(b);
if ((b == '\n') && autoFlush)
out.flush();
}
}
catch (InterruptedIOException x) {
Thread.currentThread().interrupt();
}
catch (IOException x) {
trouble = true;
}
}
但这会影响种族的行为吗?
认为:
boolean flag = true;
Thread 1:
System.out.println();
flag = false;
System.out.println();
Thread 2:
System.out.println();
while(flag){
System.out.println();
}
现在,如果我们看到两个线程都在锁定同一个对象,即this
(PrintStream),现在因为它们flag
包含在两个线程之间sysouts
,它们正在获取和释放相同的锁,那么flag
值将从缓存中刷新并在内存中更新其他线程可以看到它。
因此,由于模拟比赛很困难,理论上是否有可能这段代码是线程安全的,线程 2 会看到对 的更改flag
?
如果是,那么volatile
使用 可以达到相同的效果System.out.println();
吗?