码迷,mamicode.com
首页 > 编程语言 > 详细

Java线程-volatile不能保证原子性

时间:2018-01-20 17:52:24      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:++   out   style   通过   vold   .com   class   void   图片   

下面是一共通过volatile实现原子性的例子:

通过建立100个线程,计算number这个变量最后的结果。

package com.Sychronized;

public class VolatileDemo {

    private volatile int number=0;
    public int getNumber()
    {
        return this.number;
    }
    public void increase()
    {
        this.number++;
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        final VolatileDemo volDemo=new VolatileDemo();
        for(int i=0;i<100;i++)
        {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    volDemo.increase();
                }
            }).start();
        }
        
        //如果还有子线程在运行,主线程就让出CPU资源
        //直到所有的子线程都运行完了,主线程再继续往下执行
        while(Thread.activeCount()>1)
        {
            Thread.yield();
        }
        
        System.out.println("number:"+volDemo.getNumber());
    }

}

运行结果:

发现有几种结果:

技术分享图片

技术分享图片

造成这个结果的原因就是,volatile关键字具有可见性,number++实际上有三步操作,但是不具备原子性。

 

Java线程-volatile不能保证原子性

标签:++   out   style   通过   vold   .com   class   void   图片   

原文地址:https://www.cnblogs.com/alsf/p/8321254.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!