原则上,我们在编写代码的时候,总是推荐将同步块
的作用范围
限制得尽量小
——只在共享数据的实际作用域中才进行同步,这样是为了使得需要同步的操作数量尽可能变小,如果存在锁竞争,那等待锁的线程也能尽快拿到锁。
大部分情况下,上面的原则都是正确的,但是如果一系列的连续操作
都对同一个对象反复加锁和解锁,甚至加锁操作
是出现在循环体
中的,那即使没有线程竞争,频繁地进行互斥同步操作也会导致不必要的性能损耗。
如果虚拟机探测到有这样一串零碎的操作
都对同一个对象
加锁,将会把加锁同步的范围扩展(粗化)到整个操作序列的外部,扩展到第一个操作之前
直至最后一个操作之后
,这样只需要加锁一次就可以了。
网友评论