更多多线程相关知识点详见个人主页【多线程相关】专栏
volatile
基本概念
- volatile是Java提供的一种轻量级的同步机制,只能用于修饰变量
可见性、有序性
- 在多线程环境下,本身不具备可见性和有序性
- 不具备可见性是指:线程A对共享变量的修改,对于线程B来说是不可见的
- 不具备有序性是指:为了优化性能,编译器和处理器可能会对指令进行重排序,使执行顺序与代码顺序不完全相同
如何保证可见性
volatile保证可见性的方案是
- volatile 会对其修饰的变量的写操作添加Lock前缀指令,将缓存信息写入内存
- 缓存信息被写入内存后,会导致其他线程存储的内存地址的数据无效
- 线程在获取变量的值时,会检查自己现在缓存信息是否被修改
- 如果被修改,就从将自己的缓存信息更新为当前内存信息,然后再获取变量信息
如何保证有序性
- volatile 会对其修饰的变量添加读写内存屏障,进而实现禁止指令重排序,保证其原有的顺序
原子性
- 原子性是指:某些操作不可分割,要么全做,要么不做
为何无法保证原子性
- 被volatile修饰的变量不具有原子性,对于某个符合操作来说(如i++),多个线程同时进行i++,无法保证两个线程的原子性。i++实际上是先取i的值,再i+1,最后把新值写回i,可能线程A获取到i的值后还没有+1就已经阻塞了,此时线程B访问i,获取的还是原值,无法保证变量i的原子性
volatile和synchronized的区别
- volatile轻量级,开销较小,synchronized重量级,开销较大
- volatile能保证可见性和有序性,无法保证原子性,synchronized可以保证可见性有序性和原子性
- volatile不会造成线程的阻塞,synchronized有可能会造成线程的阻塞
- volatile适用于一个线程写,多个线程读,如状态标志,synchronized适用于临界区,如共享资源的读写

被折叠的 条评论
为什么被折叠?



