下面提到对对象级锁使用显式锁声明是一种好的做法。但是,我认为对于我们创建的对象的每个实例,最终都会为锁创建一个新对象,并通过锁访问我们的方法,这都是很昂贵的步骤。
但是,对于同步方法,我相信没有任何事情,因为您正在使用对象自己的锁,而您只需支付获取锁的费用。您避免创建显式锁对象。
我在这里错过了什么吗?
public class DemoClass
{
private final Object lock = new Object();
public void demoMethod(){
synchronized (lock)
{
//other thread safe code
}
}
}
答案 0 :(得分:3)
使用显式锁是否昂贵?
通常,不会。它不算贵。 (模数不同的人有不同的见解,不同的应用有不同的要求。)
锁Object
实例的开销约为8个字节的内存,加上用于保存对父对象中的锁的引用的变量的内存。总共12或16个字节。
创建锁Object
实例的成本为...几纳秒。 (不知道确切多少,但微不足道。)
在锁Object
实例变为垃圾时回收它的成本通常为零。 (当锁及其父对象不是垃圾时,会产生GC成本。)
除非您有数百万个对象 或对象周转率过高 或您具有严重的内存或延迟限制,否则这些开销都不算什么。
(或者,如果您决定对不需要锁定的东西设置/使用锁定。但这是另一个问题。)
在显式锁对象上获取或释放锁与在this
上获取/释放锁的成本之间的差异最小(AFAIK)。也许只有一次内存访问。
对于典型应用程序,这些成本差异无关紧要。有更多重要的事情需要优化。标准建议适用:
与锁定this
可能引起的潜在问题相比,性能问题可能显得微不足道。实际上,这取决于您的应用程序复杂性和实现细节。
1-对您和您的同事来说足够简单。它取决于上下文。