锁的消除和粗化

锁的消除

出现的时机:虚拟机即时编译期运行时。

出现的原因:主要判断依据就是来源于逃逸分析的数据支持,如果判断在一段代码中,堆上的所有数据都不会逃逸出去从而被其他线程访问到,那就可以把它们当做栈上的数据对待,认为它们是线程私有,同步锁无须进行。

出现的典型例子:



本身对于String的连接操作JVM会转化成StringBudiler进行连接,既然转化成了sb,那么其实sb是一个局部变量,对于append操作加锁并没有任何效果,因为其他线程在外部是访问不到它的,就可以进行锁的消除。


锁的粗化

原则上对于锁的使用都是需要细化到尽量小的范围,大部分情况下,都是正确的,但是一些列的加锁和解锁操作很是麻烦。造成性能损坏。

所以有了锁的粗化的概念。类似上图中的append方法,如果虚拟机探测到有一串零碎操作都是对同一对象加锁,将会把加锁同步的范围扩展到整个操作序列的外部,也就是在第一个和最后一个append操作之后。

猜你喜欢

转载自blog.csdn.net/qq_32924343/article/details/79883539