【发布时间】:2019-03-18 18:23:28
【问题描述】:
我正在学习 Java 中的 volatile 和 synchronized,我看到 synchronized 用于像 x++ 这样的读-修改-写操作,而 volatile 用于读写操作。我想问你两个问题。读写操作看起来如何?
对于第二个问题,我有这个代码:
public class StopThread {
private static volatile boolean stop;
public static void main(String[] args) throws InterruptedException {
new Thread(new Runnable() {
@Override
public void run() {
while (!stop) {
System.out.println("In while...");
}
}
}).start();
TimeUnit.SECONDS.sleep(1);
stop = true;
}
}
而且我不明白为什么这是一个读写操作,因为 stop 变量将从 false 修改为 true。那么这不是一个读-修改-写操作吗?谢谢!
【问题讨论】:
-
“修改”和“写入”有什么区别?
-
在这种情况下,两个线程都将使用共享变量来执行完全不同的操作。由于将使用共享变量,因此您需要对其进行同步。一个线程将读取变量,另一个线程将对其进行修改。随心所欲地调用它。
-
IMO 你问错问题了。线程之间共享数据的问题在于,为了有意义地更新某些数据对象,通常需要一个线程暂时将对象置于某种无效或错误状态。通过正确使用
synchronized,您可以防止其他线程看到该无效/错误状态。volatile关键字根本无法解决这个问题,但还有一个次要问题,volatile和synchronized都可以帮助解决...... -
...编译器、运行时和硬件都可以“优化”您的代码。这些优化可以假设线程之间没有数据共享,如果您的线程实际上确实共享,事情可能会出错。
volatile关键字只是声明“这个变量是共享的”。synchronized关键字做了更复杂的事情:它保证当线程 A 离开synchronized(a)...块,然后线程 B 随后进入synchronized(a)...(注意!相同的a),那么线程 B 将保证看到所有内容那个线程 A 做了。
标签: java multithreading concurrency synchronized volatile