volatile关键字原子性_java培训

发布时间:2020年12月04日作者:atguigu浏览次数:719

volatile关键字能保证原子性吗?

TestVolatileAtomicity

public class TestVolatileAtomicity extends Thread {
    volatile public static int count;

    private static void addCount() {
        for (int i = 0; i < 100; i++) {
            count = i;
        }
        System.out.println(“count=” + count);

    }

    @Override
    public void run() {
        addCount();
    }

    public static void main(String[] args) {
        TestVolatileAtomicity[] testVolatileAtomicities = new TestVolatileAtomicity[100];
        for (int i = 0; i < 100; i++) {
            testVolatileAtomicities[i] = new TestVolatileAtomicity();
        }
        for (int i = 0; i < 100; i++) {
            testVolatileAtomicities[i].start();
        }
    }
}

运行结果:

count=99
count=99
count=2
count=99
count=99
count=55
count=97
count=99
count=99

上面的“count=i;”是一个原子操作,但是运行结果大部分都是正确结果99,但是也有部分不是99的结果。

解决办法: 使用synchronized关键字加锁(Lock和AtomicInteger原子类也可以)

修改TestVolatileAtomicity.java如下:

java培训

这样运行输出的count就都为99了,所以要保证数据的原子性还是要使用synchronized关键字。 ### 四 synchronized关键字和volatile关键字比较

  1. volatile关键字是线程同步的轻量级实现,volatile性能肯定比synchronized关键字要好。
  2. volatile关键字只能用于变量,synchronized关键字可以修饰方法以及代码块。synchronized关键字在6之后,为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁以及其它各种优化之后执行效率有了显著提升,实际开发中使用synchronized关键字更多一些。
  3. 多线程访问volatile关键字不会发生阻塞,而synchronized关键字可能会发生阻塞。
  4. volatile关键字能保证数据的可见性,但不能保证数据的原子性。synchronized关键字两者皆可保证。

volatile关键字用于解决变量在多个线程之间的可见性,而synchronized关键字解决的是多个线程之间


上一篇:
下一篇:
相关课程

java培训 大数据培训 前端培训

关于尚硅谷
教育理念
名师团队
学员心声
资源下载
视频下载
资料下载
工具下载
加入我们
招聘岗位
岗位介绍
招贤纳师
联系我们
全国统一咨询电话:010-56253825
地址:北京市昌平区宏福科技园2号楼3层(北京校区)

深圳市宝安区西部硅谷大厦B座C区一层(深圳校区)

上海市松江区谷阳北路166号大江商厦3层(上海校区)

武汉市东湖高新开发区东湖网谷(武汉校区)

西安市雁塔区和发智能大厦B座3层(西安校区)

成都市成华区北辰星拱青创园综合楼3层(成都校区)