何时更喜欢私有锁定对象,而不是在固有锁上同步一个块(这)?请引用两者的结果。

私人锁定对象: -

Object lock =new Object();  
synchronized(lock)
{  }

固有锁(此): -

synchronized(this)
{  }
有帮助吗?

解决方案

使用显式 lock 对象可以允许不同的方法在不同的锁上同步,并避免不必要的争论。它还使锁更加明确,并且可以使搜索使用锁定的块更容易搜索代码。

但是,您可能也不想这样做!在java.util.concurrent中找到适当的类,然后使用它。 :)

其他提示

如果您要进行某种锁定碎片,即,您只需要锁定对象的某些部分,而其他客户仍然可以访问其他客户端,则私有锁可能会很有用。

一个简单的理解此概念的简单是数据库中的表锁定:如果您正在修改一个表,则在该表上获取锁定,而不是整个数据库,因此其余的表可以由其他客户端修改。如果您需要实现类似的逻辑,但是在POJO中,您将根据需要使用尽可能多的私人锁。

这种方法的一个缺点是您的班级被许多对象混乱。这可能表明您需要在更简单的锁定策略的更精细的类中对其进行重构,但这完全取决于您的设计和实现。

这些都使用固有的锁。您的第一个示例是使用固有锁 lock, ,第二个是使用固有锁 this. 。问题是是否 this 确实是您要锁定的,通常不是。

考虑情况,当您使用时 synchronized(this) 在您的一种方法中。您有这个类的2个对象,这些对象引用了一些共享资源。如果你锁定 this 那么,您将不会对该资源有相互的排他性。您需要锁定可以访问资源可以访问的所有物体。

锁上 this 只有重要的资源是班级本身的一部分。即使在某些情况下,锁定对象也更好。另外,如果您的班级中有几种不同的资源,则不需要整体上相互排斥,但是单独使用,那么您需要几个锁定对象。

关键是真的知道如何 同步 有效,并注意您的代码实际在做什么

实际上,使用两者都不会有任何区别,更多的是选择/样式,API作者会锁定对象 - 通过同步(this)或明确同步在任何对象方法 -, ,或使用内部监视器取决于共享资源,您可能不希望API用户访问您的内部锁定,或者您可能希望将选择给API用户共享对象固有锁定。

无论哪种方式,这些选择都不是错误的,更多的是这种锁定的意图。

实践中的Java并发, ,这将使您成为并发的主人,并澄清许多概念,这有时与您的选择而不是正确性有关。

每个对象只有一个固有的锁。

使用同步关键字: 如果您从两个不同的线程从同一对象调用两个同步方法,那么即使是想象一个线程可以运行方法一,另一个线程可以运行方法两个,这将不会发生,因为这两种方法都共享相同的固有锁(属于目的)。据此,一个线程将必须等待另一个线程完成,然后才能获取内在锁以运行其他方法。

但是,如果您使用多个锁, ,您将确保一次只能访问一个线程,并且只有一个线程可以一次访问两个线程。但是,您可以同时通过一个线程访问该方法一,然后可以访问一个方法,然后减少操作所需的时间。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top