volatile和synchronized 的区别
原子性: 一个操作要么全做,要么全不做,就像不可分割的原子一样
可见性:指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值
有序性: 程序执行的顺序按照代码的先后顺序执行,禁止进行指令重排序。看似理所当然的事情,其实并不是这样,指令重排序是JVM为了优化指令,提高程序运行效率,在不影响单线程程序执行结果的前提下,尽可能地提高并行度。但是在多线程环境下,有些代码的顺序改变,有可能引发逻辑上的不正确。
volatile 是 synchronized 弱同步的方式
synchronized 是加锁,能保证 可见性,有序性 和 原子性
volatile,只能保证 可见性,有序性,不能保证 原子性
synchronized 功能强大,但是缺点也明显,就是 性能损耗 和 线程阻塞
volatile,写入变量值不依赖变量当前值,那么就可以用
例如:
自增操作 count++
count++ 并不是一个原子操作, 它分为3步:
①. 从内存中取出原有的count值
②. 进行i++的操作
③. 把count++后的值赋给count并写入到主内存
count++ 依赖当前值的,所以不能靠volatile解决问题