1、理解原子性:
上面说到volatile不具备原子性,那么原子性到底是什么呢?先看如下代码

public class TestVolatile {public static void main(String[] args) {AtomicDemo atomicDemo = new AtomicDemo();for (int x = 0; x < 10; x++) {new Thread(atomicDemo).start();}}
}class AtomicDemo implements Runnable {private int i = 0;public int getI() {return i++;}@Overridepublic void run() {try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(getI());}
}

这段代码就是在run方法里面让i++,然后启动十个线程去访问。看看结果:

可以发现,出现了重复数据。明显产生了多线程安全问题,或者说原子性问题。所谓原子性就是操作不可再细分,而i++操作分为读改写三步,如下:

int temp = i;
i = i+1;
i = temp;

所以i++明显不是原子操作。上面10个线程进行i++时,内存图解如下:

看到这里,好像和上面的内存可见性问题一样。是不是加个volatile关键字就可以了呢?其实不是的,因为加了volatile,只是相当于所有线程都是在主存中操作数据而已,但是不具备互斥性。比如两个线程同时读取主存中的0,然后又同时自增,同时写入主存,结果还是会出现重复数据

volatile不具备原子性相关推荐

  1. volatile能保证原子性吗?

    volatile不能保证原子性. 当跟自增操作一起时,自增操作本身不是原子性操作. class Data {public volatile int number;public void add(){n ...

  2. 为什么volatile不能保证原子性而Atomic可以?

    在上篇<非阻塞同步算法与CAS(Compare and Swap)无锁算法>中讲到在Java中long赋值不是原子操作,因为先写32位,再写后32位,分两步操作,而AtomicLong赋值 ...

  3. java volatile 原子性_Java中volatile不能保证原子性的证明

    Java并发编程之验证volatile不能保证原子性 通过系列文章的学习,凯哥已经介绍了volatile的三大特性.1:保证可见性 2:不保证原子性 3:保证顺序.那么怎么来验证可见性呢?本文凯哥(凯 ...

  4. java volatile 原子性_为什么volatile不能保证原子性而Atomic可以?

    在上篇<非阻塞同步算法与CAS(Compare and Swap)无锁算法>中讲到在Java中long赋值不是原子操作,因为先写32位,再写后32位,分两步操作,而AtomicLong赋值 ...

  5. volatile 和 atomic 原子性的区别和联系

    volatile 和 atomic 原子性的区别和联系 作者:wenyinfeng 转载时,请注明原文出处,谢谢! An incorrect piece of lore that is often r ...

  6. java volatile 原子性_Java并发编程之验证volatile不能保证原子性

    Java并发编程之验证volatile不能保证原子性 通过系列文章的学习,凯哥已经介绍了volatile的三大特性.1:保证可见性 2:不保证原子性 3:保证顺序.那么怎么来验证可见性呢?本文凯哥(凯 ...

  7. volatile不能保证原子性,atomic不仅保证可见性还有原子性CAS分析

    给一个变量加了volatile关键字,就会告诉编译器和JVM的内存模型:这个变量是对所有线程共享的.可见的,每次jvm都会读取最新写入的值并使其最新值在所有CPU可见.volatile似乎是有时候可以 ...

  8. 线程安全、volatile关键字、原子性、并发包、死锁、线程池

    [线程安全.volatile关键字.原子性.并发包.死锁.线程池] 内容 线程安全 synchronized关键字\Lock接口 同步代码块 同步方法 Lock锁 高并发可见性问题 volatile关 ...

  9. java(八)-线程安全、volatile关键字、原子性、并发包、死锁、线程池

    Day08[线程状态.volatile关键字.原子性.并发包.死锁.线程池] 今日目标 线程安全 volatile关键字 原子性 并发包 死锁 线程池 教学目标 能够说出volatile关键字的作用 ...

最新文章

  1. XCode 7上传遇到ERROR ITMS-90535 Unexpected
  2. 足球动图gif(一)
  3. 解决 项目cocoapods diff: /../Podfile.lock: No such file or directory
  4. 堡垒之夜安装包删除_堡垒之夜安装不了怎么办_常见安装下载问题解决方法_3DM网游...
  5. 彼尔盖茨的十句话,绝对让你改变一生
  6. ehcache缓存原理_Mybatis-09-缓存
  7. 烟花散尽漫说无(參考资料)
  8. pycharm 2018.1 专业版激活 亲测可用!!!
  9. paip.从HTML select 获取数据
  10. 谷歌浏览器Chrome离线安装包下载地址
  11. 微信红包管理数据库mysql_莫晓东 - 微信红包数据库架构演变
  12. 程序员课外拓展004:Photoshop CC 2018详细图文安装教程
  13. 厦门大学计算机调剂要求,厦门大学调剂公告
  14. 多媒体计算机中的扬声器指的是音箱和,多媒体音箱还以为只是个喇叭,原来这么多名堂...
  15. 论文笔记5:Noise Reduction of Hyperspectral Imagery Using Hybrid Spatial-Spectral Derivative-Domain Wavel
  16. 【分享】沪江网提供的每日一句API
  17. 智慧交管可视化决策系统
  18. Oracle Database SQL Language Reference 笔记(3)—— 伪列(续)
  19. 利用老毛桃pe启动U盘启动ubuntu.iso,完成ubuntu系统的安装
  20. 用python操控手机刷视频,自动刷金币

热门文章

  1. Real to Int
  2. ubuntu16.04 + ros-kinetic 配置cartographer
  3. oracle在线sql数据库设计,一款在线ER模型设计工具,支持MySQL、SQLServer、Oracle、Postgresql...
  4. ubuntu升级python_Ubuntu 升级python3为更高版本【已实测】
  5. 第5章 Python 数字图像处理(DIP) - 图像复原与重建8 - 估计噪声参数
  6. C#JsonConvert.DeserializeObject反序列化json字符
  7. OO第三单元总结:JML
  8. 快速构建ceph可视化监控系统
  9. Dlib与OpenCV图片转换
  10. POJ 2773 欧几里得