我发现一个代码片段可以正常工作,直到锁定处于对象级别并且当相同的锁定成为静态最终(即添加静态关键字)时,代码开始失败并出现与并发相关的错误。
在对象级别工作的锁是否应该在其范围变为静态后重新工作?我认为将锁设置为静态只会使其更具限制性,并且不应开始导致比在对象级别时更多的并发问题。我发现相反的情况正在发生。
我发现一个代码片段可以正常工作,直到锁定处于对象级别并且当相同的锁定成为静态最终(即添加静态关键字)时,代码开始失败并出现与并发相关的错误。
在对象级别工作的锁是否应该在其范围变为静态后重新工作?我认为将锁设置为静态只会使其更具限制性,并且不应开始导致比在对象级别时更多的并发问题。我发现相反的情况正在发生。
在对象级别工作的锁是否应该在其范围变为静态后重新工作?
如果您将锁从实例锁变为静态锁,则不会导致并发问题。您是正确的,它应该使代码更具限制性,因为将使用单个锁而不是多个实例锁。当然,这是如果有问题的锁是static final
并且您的代码中的所有位置都适当地锁定了它。
public static final Object lockObject = new Object();
可能发生的情况是,移动锁发现了以前存在的错误,但应用程序计时导致它被隐藏。通过锁定一个static
锁(或一个static
方法),应用程序中线程的时间很可能会发生显着变化。
如果您发布有关代码或您遇到的错误的更多详细信息,我们可以提供更好的答案。
静态级别的锁比对象级别的锁更有可能在不同线程之间共享(以一种非常通用的方式 - 因为它取决于实际代码和所涉及的线程)。
实际上,静态锁与类相关联,换句话说,单个锁对象在所有线程之间共享。通常,当更多线程需要访问同一个锁时,如果代码中存在错误,您就越有可能遇到并发问题(如死锁和饥饿)。
概括地说,如果您在使用对象级锁时遇到并发问题,那么在将锁升级到类级别时可能会遇到更多麻烦。