请看下面的代码:
private static boolean flag=true; // main thread will call flag=false
private final static Object lock=new Object(); // lock condition
public static void thread1(){
while (flag){
synchronized (lock){
// some work
}
}
}
public static void main(String[] args) throws Exception {
Thread t1=new Thread(()->{
thread1();
});
t1.start();
Thread.sleep(1000);
flag=false;
// The program can stop normally
}
无论何时,当一个线程进入同步块时,是否会从主存储器中加载变量标志的值?
感谢您的详细说明,因为我不确定该标志是否具有事前关系。从字面上看,该标志不在同步块中。
更新1:
我知道使用volatile可以,而且我也知道如何编写正确的代码,但是我现在想知道是否没有volatile关键字。是否同步可以保证可见性。注意:标志变量不在同步块中。
更新2:
我再次更新了代码,我的win10 + JDK8系统上的代码可以正常停止,您认为它是正确的还是偶然的,因为尚未在所有硬件系统上进行测试,因此我需要理论指导。
关注以下问题:
循环条件(标志变量)是否与循环内的同步块具有先发生关系,如果存在先发生关系,jvm是否确保从主存储器中加载了标志变量,即使标志变量没有在同步块中。
如果每个人都认为没有事前发生的关系,那么您如何解释当我删除同步块时,代码将无限期地循环。当我添加它时,它将正常停止。这只是意外吗?
素胚勾勒不出你
翻阅古今
相关分类