内容提要
• volatile不能保证原子性
• volatile能避免指令重排
• volatile的使用场景:让变量在线程间都可见
• 使用场景:ConcurrentHashMap
不能保证原子性
• 用volatile修饰一个int型变量,初始值是0
• 起1000个线程,每个线程对其加1,结果小于1000
能避免指令重排 (记下)
• 在编译和执行代码时,出于优化考虑,会重排指令;
• 重排序的话呢,在大多数场景下不会影响结果,但是在多线程环境下可能会有问题;
• volatile能阻止指令重排,volatile能阻止指令重排。
volatile能保证线程间可见 (记下)
• 对线程内存变量的写操作,能立即写回主内存
• 该值在其它线程内存里失效
使用场景:ConcurrentHashMap
• 能实现并发的HashMap
• 存储该对象长度的变量是volatile
• private transient volatile long baseCount;
• 多个线程同时读写该ConcurrentHashMap对象,对长度的修改能立即让其它线程感知
总结
1. volatile能阻止指令重排
2. volatile不能保证原子性
3. 能确保线程间可见
4. 举例说明volatile的用法,顺便引出ConcurrentHashmap话题。。