【发布时间】:2016-09-02 20:18:51
【问题描述】:
我有以下代码
import java.util.concurrent.*;
public class dsd {
private static boolean stopRequested;
private static void requestStop() {
stopRequested = true;
}
private static synchronized boolean stopRequested() {
return stopRequested;
}
public static void main(String[] args)
throws InterruptedException {
Thread backgroundThread = new Thread(new Runnable() {
public void run() {
int i = 0;
while (!stopRequested())
i++;
}
});
backgroundThread.start();
TimeUnit.SECONDS.sleep(1);
requestStop();
}
}
问题是为什么即使requestStop() 没有同步它也能工作?如果我尝试对stopRequested() 做同样的事情,它就不再起作用了。为什么该变量上的线程并发没有问题?我知道同步使变量出现在其他线程的一致状态中。但是这里的变量没有同步,似乎没有效果。
【问题讨论】:
-
...为什么有效... 如果您说出“有效”的含义,将会很有帮助。这并不总是显而易见的,尤其是对于像您这样不产生任何输出的程序。我猜测“工作”意味着程序在一秒钟后很快就停止了。
-
你需要同步(或不稳定)来保证你想要的行为,但如果你没有它,如果你幸运的话,你可能仍然会得到它(小像这样的程序更容易幸运)。换句话说,“你不能保证 X”不同于“你不能保证 X”。
-
如果我尝试对 stopRequested() 做同样的事情... 如果您尝试做同样的事情什么?你做了什么?你做了什么?你是说如果你在
stopRequested()的声明中加上synchronized? -
“用同样的东西”我在第二种方法中提到了扔掉同步
标签: java multithreading synchronized