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

  

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

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

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

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值