1.锁升级/锁膨胀
synchronized内部实现了“自适应”操作,(1)没必要加锁时,是偏向锁。(2)锁竞争不激烈,以轻量级锁状态进行工作(自锁锁)。(3)竞争激烈时,使用重量级锁(挂起等待锁)
什么是偏向锁?
类似懒汉模式,能不加锁就不加锁,只有在必要的时候才加锁。如果两个线程本身调度的时候恰好错开,此时t1和t2并不会发生锁竞争,没必要真加锁。而偏向锁的功能并不是真加锁,而是设置应该状态。
2.锁消除
JVM会判断是否需要加锁,如果只有一个线程或者有多个线程但不涉及修改同一个变量,即使你代码中写synchronized,JVM也会把他去除。
锁消除是一个编译器优化的行为,所以只有编译器判定100%能消除,才会进行消除。
3.锁粗化
锁粒度:synchronized对应的代码块中包含的代码多,粒度粗;包含代码少,粒度细。
锁粗化:就是把细粒度的加锁-->粗粒度的加锁
为了减小加锁解锁的开销,就把一连串的已经加过锁的代码和在一起,只用一个锁。