volatile
被volatile修饰的共享变量进行写操作的时候,字节码中会出现一个Lock前缀的指令。
- volatile的两条实现原则
1、 Lock前缀指令会引起处理器缓存会写到内存
2、 处理器缓存回写到内存会导致其他处理器的缓存无效
这里其实就是缓存一致性协议的体现。 - volatile的优化
追加字节的方式
synchronized
锁的对象分为三种:
1、普通同步方法而言,锁是当前实例对象
2、静态同步方法而言,锁是当前类的class对象
3、同步方法块,锁是Synchronized括号里配置的对象
JVM基于进入和退出Monitor对象来实现方法同步和代码块同步,实现细节不一样
synchronized用的锁是存在java对象头里面的
锁一共有4种状态:无锁-》偏向锁-》轻量级锁-》重量级锁,所可以升级但是不能降级
原子操作的实现原理
处理器通过总线锁和缓存锁实现原子操作。
但是有两种情况处理器不会使用缓存锁:
1、当操作的数据不能被缓存在处理器内部,或者操作的数据跨多个缓存行
2、有些处理器不支持缓存锁定
Java如何实现原子操作:
通过锁和循环CAS的方式实现原子操作
CAS实现原子操作的三大问题:
1、ABA问题---解决办法:加版本号
2、循环时间长开销大
3、只能保证一个共享变量的原子操作