锁膨胀

Posted amunote

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了锁膨胀相关的知识,希望对你有一定的参考价值。

如果一系列的连续操作都对同一个对象反复加锁和解锁,甚至加锁操作是出现在循环体中的,那即使没有线程竞争,频繁地进行互斥同步操作也会导致不必要的性能损耗。 如果虚拟机探测到有这样一串零碎的操作都对同一个对象加锁,将会把加锁同步的范围扩展(膨胀)到整个操作序列的外部(由多次加锁编程只加锁一次)。

一种需要锁粗化的极端的情况是:

for(int i=0;i<size;i++){
    synchronized(lock){
    }
}

上面代码每次循环都会进行锁的请求、同步与释放,看起来貌似没什么问题,且在jdk内部会对这类代码锁的请求做一些优化,但是还不如把加锁代码写在循环体的外面,这样一次锁的请求就可以达到我们的要求,除非有特殊的需要:循环需要花很长时间,但其它线程等不起,要给它们执行的机会。

锁粗化后的代码如下:

synchronized(lock){
    for(int i=0;i<size;i++){
    }
}

以上是关于锁膨胀的主要内容,如果未能解决你的问题,请参考以下文章

片段上的 Mapbox 膨胀视图

java锁膨胀过程

Android TabLayout ViewPager 不会在 backstack 上膨胀标签片段

在我的“设置”片段中膨胀类 PreferenceScreen 时出错

第二次在对话框中膨胀片段时出错

Android:在drawerlayout中使用地图膨胀片段时出错