繁体   English   中英

对象级别和类级别锁定

[英]Object level and Class level locking

我发现一个代码片段可以正常工作,直到锁定处于对象级别,并且将同一锁定设置为static final(即,添加了static关键字)后,代码开始失败,并发与并发相关的错误。

一旦将其作用域设为静态,在对象级别起作用的锁是否应该起作用? 我认为将锁设为静态只会使其更具限制性,并且不应比在对象级别上引起更多的并发问题。 我发现相反的情况正在发生。

一旦将其作用域设为静态,在对象级别起作用的锁是否应该起作用?

如果将锁从实例锁变为静态锁,则不会导致并发问题。 您是正确的,它应该使代码更具限制性,因为将使用单个锁而不是多个实例锁。 当然,如果所讨论的锁是static final并且代码中的所有位置都在适当地对其进行锁定,那么这就是。

public static final Object lockObject = new Object();

可能发生的情况是,移动锁发现了以前存在的错误,但是由于应用程序计时导致该错误被隐藏。 通过锁定static锁(或static方法),应用程序中线程的时序很可能会发生重大变化。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM