volatile和synchronized 的区别
原子性: 一个操作要么全做,要么全不做,就像不可分割的原子一样
可见性:指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值
有序性: 程序执行的顺序按照代码的先后顺序执行,禁止进行指令重排序。看似理所当然的事情,其实并不是这样,指令重排序是JVM为了优化指令,提高程序运行效率,在不影响单线程程序执行结果的前提下,尽可能地提高并行度。但是在多线程环境下,有些代码的顺序改变,有可能引发逻辑上的不正确。
volatile 是 synchronized 弱同步的方式
synchronized 是加锁,能保证 可见性,有序性 和 原子性
volatile,只能保证 可见性,有序性,不能保证 原子性
synchronized 功能强大,但是缺点也明显,就是 性能损耗 和 线程阻塞
volatile,写入变量值不依赖变量当前值,那么就可以用
例如:
自增操作 count++
count++ 并不是一个原子操作, 它分为3步:
①. 从内存中取出原有的count值
②. 进行i++的操作
③. 把count++后的值赋给count并写入到主内存
count++ 依赖当前值的,所以不能靠volatile解决问题
标签:
java
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2018-07-10 正则表达式-非捕获匹配,正向预查,反向预查
2015-07-10 JavaScript数据类型转换