首先,本文并不是在详细的讲解volatile关键字,如果对于相关概念不熟悉的朋友还请调查相关资料。
volatile的作用
- 线程共享
- 但是无法保证操作的原子性
至于volatile关键字的相关概念,本人也看过很多资料,但是对于其实际的效果并没有写过例子去验证,突然有时间就想着写一个例子看看,可是发现完全达不到预想的“共享”的效果(包括网上的许多例子也尝试了),于是产生对于这个关键字的左右也产生了一定的怀疑。甚至差一点就走向了歧途,误认为volatile解决的只是及时与不及时共享的问题。最后还是查到了问题所在这里跟大家分享一下。首先看例子(来自网上):
public class VolatileTest extends Thread {
/*volatile*/ boolean flag = false;
int i = 0;
@Override
public void run() {
while (!flag) {
i++;
}
}
public static void main(String[] args) throws Exception {
VolatileTest vt = new VolatileTest();
vt.start();
Thread.sleep(2000);
vt.flag = true;
System.out.println("stope" + vt.i);
}
}
问题:运行时不加volatile线程仍然可以终止。
解答:问题是因为我们使用的jdk是client模式而非server模式,而web应用都是server模式启动的。
如何查看jdk是client模式还是server模式?
hotspot后面是server就是server模式了,我的问题在于我的电脑上有两个jdk,IDEA用的是另一个jdk,切换了一下jdk就可以。
64位jdk是支持server模式的,所以不会有这个问题。
希望能帮到有相同问题的朋友。