对象级别和类级别锁定

时间:2013-02-26 20:57:17

标签: java multithreading locking

我发现一个代码片段工作正常,直到锁定在对象级别,并且当相同的锁定为静态最终(即添加静态关键字)时,代码开始失败并发生与并发相关的错误。

一旦其范围变为静态,锁定在对象级别reamin工作吗?我认为制作一个锁,因为静态只会使它更具限制性,并且不应该开始引起比在对象级别更多的concurrencyissues。然而,我发现了相反的情况。

2 个答案:

答案 0 :(得分:1)

  

一旦它的作用域变为静态,那么在对象级别reamin工作的锁是否应该工作?

如果将锁从实例锁移动为静态锁,则不应该导致并发问题。你是正确的,它应该使代码更具限制性,因为将使用单个锁而不是多个实例锁。当然,如果有问题的锁是static final并且代码中的所有位置都正确地锁定了它。

public static final Object lockObject = new Object();

可能发生的事情是移动锁已经发现了之前存在的错误但是应用程序计时导致它被隐藏。通过锁定static锁定(或static方法),应用程序中线程的时间很可能会发生显着变化。

如果您发布有关代码或更多错误的更多详细信息,我们可以提供更好的答案。

答案 1 :(得分:0)

静态级别的锁更可能在不同的线程之间共享而不是对象级别的锁(以非常一般的方式 - 因为它取决于所涉及的实际代码和线程)。

实际上,静态锁与类相关联,换句话说,单个锁对象在所有线程之间共享。通常,当更多线程需要访问同一个锁时,如果代码中存在错误,则更有可能遇到并发问题(如死锁和饥饿)。

作为一种概括,如果您遇到使用对象级别锁定的并发问题,那么在将锁定升级到类级别时可能会遇到更多麻烦。