volatile和synchronized 的区别

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

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

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


volatile 是 synchronized 弱同步的方式

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

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


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

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

例如:

自增操作 count++

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

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

 

 

参考:volatile和synchronized到底啥区别

posted @ 2023-07-10 09:56  全玉  阅读(83)  评论(0编辑  收藏  举报