想问一下各位大神,我想得到一个Volatile的使用案例,这是以下代码,按照下面的代码,
如果我设置jvm运行参数为 -server 的时候,应该会一直运行下去,程序进入死循环,但实际上
并没有,这是为什么呢?
public class Main {
public static void main(String[] args) {
VolatileThread volatileThread = new VolatileThread();
volatileThread.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
volatileThread.setContinue(false);
}
}
public class VolatileThread extends Thread{
private boolean isContinue = true;
public void setContinue(boolean aContinue) {
isContinue = aContinue;
}
@Override
public void run() {
while (isContinue){
System.out.println("Continue");
}
System.out.println("end");
}
}
我使用IDEA来运行程序,下面是我设置运行参数的图:
是我的参数未设置正确?还是例子不正确呢?
isContinue需要加volatile修饰,去看看volatile关键字的作用
最近刚好也遇到了类似的问题,在这里记录一下原因把。
先说解决方案:
while (isContinue) {
// 解决方案就是注释掉这句话
// System.out.println("Continue");
}
说一下我的猜想(不一定正确):
起初我以为是 println 里面的 synchronized 使得工作线程去同步了主线程的值,但是当我把println 换成了 Thread.sleep(1000) ,程序也同样停下来了,所以排除了这个原因。然后我尝试将while(isContinue){} 里换成如下代码:
while (isContinuePrint) {
for (int i = 0; i < 100000; i++) {
int j = i;
j ++;
}
}
while语句里的代码不涉及到任何关于加锁或者和释放CPU时间的时候,程序不会停止。所以,我的最终猜想是可能加锁的代码,或者和释放CPU时间片相关的代码,会影响到主内存和工作内存进行刷新的机制。当然,这只是我的个人猜测,如果有大佬知道为什么,可以回复一下,感谢。