volatile笔记
2024-09-05 17:22:33
总结自: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
有序性
一定程度上保证
禁止指令重排序,能保证代码执行有有序性,到落实到多线程,则无法保证前面的线程执行完毕
最新文章
- a冲刺总结随笔
- 编写安装中断7ch的中断例程:将一个以0结尾的字符串,转化为大写
- 让FineUI数据绑定支持dynamic对象
- 【mongo】Can't take a write lock while out of disk space错误
- 【JAVA、C++】LeetCode 006 ZigZag Conversion
- MYBATIS报ORA-01745: 无效的主机/绑定变量名 异常
- Android -- 距离感应器控制屏幕灭屏白屏
- 关于Linux的总结(三)
- CVTE公司面经
- 查看memcached中最大生存时间
- Java注解学习
- 【一天一道LeetCode】#25. Reverse Nodes in k-Group
- IEnumerable<;T>;和IQueryable<;T>;区分
- java将对象转map,map转对象工具类
- Confluence 6 关于统一插件管理器
- python http请求及多线程应用
- load() 方法
- .Net中使用ODP.net访问Oracle数据库
- PhpStorm 不停地 updating indices
- 禁止HTML页面缓存
热门文章
- linux tableau server 连接 presto
- 【剑指Offer面试题】 九度OJ1518:反转链表
- Activity四种启动方式
- JS探秘——那些你理解存在偏差的问题
- PDP2
- 《从零开始学Swift》学习笔记(Day 38)——构造函数与存储属性初始化
- Reverse and Compare(DP)
- 关于angularjs的复选框选中
- ubuntu14.0 hadoop2.4.0 64位基于jdk1.7搭建
- nginx + uwsgi + django/flask Nginx + php-fpm + PHP