总结自:https://www.cnblogs.com/dolphin0520/p/3920373.html

了解volatile之前得明白什么是原子性、可见性、有序性及指令重排序,详见:https://www.cnblogs.com/yanze/p/9835462.html

作用对象: 变量

可见性

可保证

首先,当使用volatile关键字时,会强制将修改的值立即写入主存。那么当线程2修改时,首先强制写入主存,且此操作会导致线程1的工作内存中缓存变量的缓存行无效,

这时由于线程1的工作内存中缓存变量的缓存行无效,所以线程1再次读取变量的值时会去主存读取。

原子性

无法保证

当某个线程被阻塞,则主存变化后无法直接使此线程工作缓存中缓存变量的缓存行失效。

假设线程1读取到变量的值后被阻塞,然后线程2对变量进行自增操作,线程2也去读取变量的原始值,由于线程1只是对变量进行读取操作,而没有对变量进行修改操作,所以不会导致线程2的工作内存中缓存变量的缓存行无效,所以线程2会直接去主存读取的值,发现的值时10,然后进行加1操作,并把11写入工作内存,最后写入主存。

然后线程1接着进行加1操作,由于已经读取了变量的值,注意此时在线程1的工作内存中变量的值仍然为10,所以线程1对变量进行加1操作后变量的值为11,然后将11写入工作内存,最后写入主存。

解决方案:

使用synchronized

使用Lock

有序性

一定程度上保证

禁止指令重排序,能保证代码执行有有序性,到落实到多线程,则无法保证前面的线程执行完毕

最新文章

  1. a冲刺总结随笔
  2. 编写安装中断7ch的中断例程:将一个以0结尾的字符串,转化为大写
  3. 让FineUI数据绑定支持dynamic对象
  4. 【mongo】Can't take a write lock while out of disk space错误
  5. 【JAVA、C++】LeetCode 006 ZigZag Conversion
  6. MYBATIS报ORA-01745: 无效的主机/绑定变量名 异常
  7. Android -- 距离感应器控制屏幕灭屏白屏
  8. 关于Linux的总结(三)
  9. CVTE公司面经
  10. 查看memcached中最大生存时间
  11. Java注解学习
  12. 【一天一道LeetCode】#25. Reverse Nodes in k-Group
  13. IEnumerable<T>和IQueryable<T>区分
  14. java将对象转map,map转对象工具类
  15. Confluence 6 关于统一插件管理器
  16. python http请求及多线程应用
  17. load() 方法
  18. .Net中使用ODP.net访问Oracle数据库
  19. PhpStorm 不停地 updating indices
  20. 禁止HTML页面缓存

热门文章

  1. linux tableau server 连接 presto
  2. 【剑指Offer面试题】 九度OJ1518:反转链表
  3. Activity四种启动方式
  4. JS探秘——那些你理解存在偏差的问题
  5. PDP2
  6. 《从零开始学Swift》学习笔记(Day 38)——构造函数与存储属性初始化
  7. Reverse and Compare(DP)
  8. 关于angularjs的复选框选中
  9. ubuntu14.0 hadoop2.4.0 64位基于jdk1.7搭建
  10. nginx + uwsgi + django/flask Nginx + php-fpm + PHP