使用显式锁是否被认为是昂贵的?
Is using explicit locks considered expensive?
有人提到对对象级锁使用显式锁声明如下所示是一种很好的做法。但是,我认为对于我们创建的对象的每个实例,我们最终都会为锁创建一个新对象并通过锁访问我们的方法,这都是昂贵的步骤。
但是,对于synchronized方法,我相信不会有任何使用对象自己的锁的情况,您只需要支付获取锁的成本。您避免创建显式锁定对象。
我在这里遗漏了什么吗?
public class DemoClass
{
private final Object lock = new Object();
public void demoMethod(){
synchronized (lock)
{
//other thread safe code
}
}
}
Is using explicit locks considered expensive?
一般不会。它不被认为是昂贵的。 (取模不同的人有不同的看法,不同的应用有不同的要求。)
锁 Object
实例的成本大约是 8 个字节的内存加上保存对父对象中锁的引用的变量的内存。总共有 12 或 16 个字节。
创建锁 Object
实例的成本是……几纳秒。 (不确定有多少,但这微不足道。)
当锁 Object
实例变成垃圾时,回收锁的成本通常为零。 (当锁及其父对象不是垃圾时会产生 GC 成本...)
这些成本都是微不足道的,除非你有数百万个这样的对象或对象周转率过高或你有严重的记忆力或延迟约束。
(或者,如果您决定在不需要锁定的事物上放置/使用锁。但这是一个不同的问题。)
在显式锁对象上获取或释放锁的成本与在 this
上获取/释放锁的成本差别很小(据我所知)。也许是一次内存访问。
对于典型 应用程序,这些成本差异无关紧要。会有更重要的事情需要优化。标准建议适用:
- 编码简单1 开始。简单更容易编写和调试...和阅读。
- 避免过早优化;例如在您编写代码时。
- 在优化之前对您的应用程序进行基准测试和分析。
- 使用测量结果来决定什么值得优化。
与锁定 this
可能导致的潜在问题相比,性能问题可能微不足道。实际上,这取决于您的应用程序复杂性和实现细节。
1 - 对您和您的同事来说足够简单。它取决于上下文。
有人提到对对象级锁使用显式锁声明如下所示是一种很好的做法。但是,我认为对于我们创建的对象的每个实例,我们最终都会为锁创建一个新对象并通过锁访问我们的方法,这都是昂贵的步骤。
但是,对于synchronized方法,我相信不会有任何使用对象自己的锁的情况,您只需要支付获取锁的成本。您避免创建显式锁定对象。
我在这里遗漏了什么吗?
public class DemoClass
{
private final Object lock = new Object();
public void demoMethod(){
synchronized (lock)
{
//other thread safe code
}
}
}
Is using explicit locks considered expensive?
一般不会。它不被认为是昂贵的。 (取模不同的人有不同的看法,不同的应用有不同的要求。)
锁 Object
实例的成本大约是 8 个字节的内存加上保存对父对象中锁的引用的变量的内存。总共有 12 或 16 个字节。
创建锁 Object
实例的成本是……几纳秒。 (不确定有多少,但这微不足道。)
当锁 Object
实例变成垃圾时,回收锁的成本通常为零。 (当锁及其父对象不是垃圾时会产生 GC 成本...)
这些成本都是微不足道的,除非你有数百万个这样的对象或对象周转率过高或你有严重的记忆力或延迟约束。
(或者,如果您决定在不需要锁定的事物上放置/使用锁。但这是一个不同的问题。)
在显式锁对象上获取或释放锁的成本与在 this
上获取/释放锁的成本差别很小(据我所知)。也许是一次内存访问。
对于典型 应用程序,这些成本差异无关紧要。会有更重要的事情需要优化。标准建议适用:
- 编码简单1 开始。简单更容易编写和调试...和阅读。
- 避免过早优化;例如在您编写代码时。
- 在优化之前对您的应用程序进行基准测试和分析。
- 使用测量结果来决定什么值得优化。
与锁定 this
可能导致的潜在问题相比,性能问题可能微不足道。实际上,这取决于您的应用程序复杂性和实现细节。
1 - 对您和您的同事来说足够简单。它取决于上下文。