volatile和synchronized 的区别

原子性: 一个操作要么全做,要么全不做,就像不可分割的原子一样

可见性:指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值

有序性: 程序执行的顺序按照代码的先后顺序执行,禁止进行指令重排序。看似理所当然的事情,其实并不是这样,指令重排序是JVM为了优化指令,提高程序运行效率,在不影响单线程程序执行结果的前提下,尽可能地提高并行度。但是在多线程环境下,有些代码的顺序改变,有可能引发逻辑上的不正确。


volatile 是 synchronized 弱同步的方式

synchronized 是加锁,能保证 可见性,有序性 和 原子性

volatile,只能保证 可见性,有序性,不能保证 原子性


synchronized 功能强大,但是缺点也明显,就是 性能损耗 和 线程阻塞

volatile,写入变量值不依赖变量当前值,那么就可以用

例如:

自增操作 count++

count++ 并不是一个原子操作, 它分为3步:
①. 从内存中取出原有的count值
②. 进行i++的操作
③. 把count++后的值赋给count并写入到主内存

count++ 依赖当前值的,所以不能靠volatile解决问题

 

 

参考:volatile和synchronized到底啥区别

posted @   全玉  阅读(96)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2018-07-10 正则表达式-非捕获匹配,正向预查,反向预查
2015-07-10 JavaScript数据类型转换
点击右上角即可分享
微信分享提示