使用显式锁是否昂贵?

时间:2020-01-21 01:53:03

标签: java multithreading java-threads

下面提到对对象级锁使用显式锁声明是一种好的做法。但是,我认为对于我们创建的对象的每个实例,最终都会为锁创建一个新对象,并通过锁访问我们的方法,这都是很昂贵的步骤。

但是,对于同步方法,我相信没有任何事情,因为您正在使用对象自己的锁,而您只需支付获取锁的费用。您避免创建显式锁对象。

我在这里错过了什么吗?

public class DemoClass
{
    private final Object lock = new Object();
    public void demoMethod(){
        synchronized (lock)
        {
            //other thread safe code
        }
    }
}

1 个答案:

答案 0 :(得分:3)

使用显式锁是否昂贵?

通常,不会。它不算贵。 (模数不同的人有不同的见解,不同的应用有不同的要求。)

Object实例的开销约为8个字节的内存,加上用于保存对父对象中的锁的引用的变量的内存。总共12或16个字节。

创建锁Object实例的成本为...几纳秒。 (不知道确切多少,但微不足道。)

在锁Object实例变为垃圾时回收它的成本通常为零。 (当锁及其父对象不是垃圾时,会产生GC成本。)

除非您有数百万个对象 或对象周转率过高 或您具有严重的内存或延迟限制,否则这些开销都不算什么。

(或者,如果您决定对不需要锁定的东西设置/使用锁定。但这是另一个问题。)

在显式锁对象上获取或释放锁与在this上获取/释放锁的成本之间的差异最小(AFAIK)。也许只有一次内存访问。


对于典型应用程序,这些成本差异无关紧要。有更多重要的事情需要优化。标准建议适用:

  • 使用简单的 1 进行编码。简单更容易编写和调试...以及阅读。
  • 避免过早优化;例如在编写代码时。
  • 在优化之前 对应用进行基准测试和配置文件。
  • 使用测量结果来决定哪些值得优化。

与锁定this可能引起的潜在问题相比,性能问题可能显得微不足道。实际上,这取决于您的应用程序复杂性和实现细节。


1-对您和您的同事来说足够简单。它取决于上下文。