【发布时间】:2019-07-05 14:18:31
【问题描述】:
在阅读接受的答案How to synchronize or lock upon variables in Java? 时,我想到如果在下面的示例中使用 volatile 而不是同步块,行为是否会改变。我想确保消息始终返回正确的值。
让我使用同样的示例:请注意,现在我已经删除了 get 方法中的同步块,并将变量消息标记为 volatile。
class Sample {
private volatile String message = null;
private final Object lock = new Object();
public void newMessage(String x) {
synchronized (lock) {
message = x;
}
}
public String getMessage() {
return message;
}
}
}
如果要更改如上所示的代码,是否会保证相同的行为?两种方法之间有什么区别吗?
提前谢谢你
【问题讨论】:
-
是的,如果是单个变量,那么
synchronized块是不必要的,而 volatile 写入就足够了。 -
谢谢埃里克。你是说当变量被标记为 volatile 时我根本不需要读取和写入同步?
标签: java concurrency synchronization