前言:
我们今天说一下synchronized的锁粗化和锁消除,那么肯定大家好奇了,什么是锁粗化,什么是锁消除呢?
锁消除-->:是指虚拟机即时编译器在运行时,对一些代码要求同步,但是被检测到不
可能存在共享数据竞争的锁进行消除。比方说:堆中的所有数据都不会逃逸出去从而被
其它线程访问到,那就可以把他们当作栈上数据对待,因为栈上数据是线程私有的,
在进行同步加锁时就无需加锁。JIT编译器编译时,对运行上下文进行扫描,去除不可
能存在竞争的锁。
就比方说上述代码,StringBuffer类本身就是线程安全的,并且大多数方法是
synchronized修饰的,当我们对它进行追加字符时,因为加锁相同,所以说
在jvm中就自动进行了锁消除。
那什么是锁粗化呢?
通过加大锁的范围,避免重复的加锁和解锁:
例如:编写代码的时候,同步代码块锁的范围要尽量的小,若存在在竞争锁,等
锁的线程也能尽快拿到锁。但是如果一系列的连续操作反复对对象进行加锁和解
锁操作,甚至加锁操作出现在循环体中,即时没有线程竞争,频繁的进行互斥同
步操作,也会导致性能损耗:下面的代码就进行了锁粗化,
就是如果虚拟机检测到一串串的操作反复的对同一个对象加锁解锁,将会
把整个操作范围扩展到整个操作序列,比方说上面的代码:就是扩展到append操作的外部,把while循环加锁,这样只需加锁一次就可以了。