volatile踩坑实例

首先,本文并不是在详细的讲解volatile关键字,如果对于相关概念不熟悉的朋友还请调查相关资料。

volatile的作用

  1. 线程共享
  2. 但是无法保证操作的原子性

至于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模式?

  volatile踩坑实例

hotspot后面是server就是server模式了,我的问题在于我的电脑上有两个jdk,IDEA用的是另一个jdk,切换了一下jdk就可以。

64位jdk是支持server模式的,所以不会有这个问题。

希望能帮到有相同问题的朋友。

上一篇:单词大学CET*级英语


下一篇:VTemplate模板引擎的使用--进阶篇