什么时候更喜欢私有锁对象来通过内部锁同步一个块(这个)? 请引用两者的结果。
私人锁定对象: -
Object lock =new Object();
synchronized(lock)
{ }
内在锁(this): -
synchronized(this)
{ }
答案 0 :(得分:1)
使用显式lock
对象可以允许不同的方法在不同的锁上进行同步,并避免不必要的争用。它还使锁更明确,并且可以更容易地在代码中搜索使用锁的块。
然而,你可能不想做任何一件事!在java.util.concurrent中找到合适的类并使用它。 :)
答案 1 :(得分:0)
如果您正在执行某种锁定分片,则私有锁可能很有用,即,您只需要锁定对象的某些部分,而其他部分仍然可以由其他客户端访问。
理解这个概念的一个简单并行是数据库中的表锁:如果要修改一个表,则获取该单个表上的锁,而不是整个数据库,因此其他表可以被其他表修改客户端。如果你需要在POJO中实现类似的逻辑,你可以根据需要使用尽可能多的私有锁。
这种方法的一个缺点是你的班级混乱了很多对象。这可能表明您需要使用更简单的锁定策略在更精细的类集中重构它,但这一切都取决于您的设计和实现。
答案 2 :(得分:0)
这些都使用内在锁。您的第一个示例使用lock
的内在锁定,而第二个示例使用this
的内在锁定。问题是this
是否真的是你想要锁定的东西,而这通常不是。
在您的某个方法中使用synchronized(this)
时,请考虑这种情况。您有此类的2个对象,并且这些对象引用了一些共享资源。如果您锁定this
,那么您将无法与该资源互相排斥。您需要锁定一些可以访问资源的对象才能访问的对象。
仅当重要资源是类本身的一部分时才锁定this
。即便如此,在某些情况下锁定对象更好。此外,如果您的类中有多个不同的资源,那么不需要作为一个整体互相排斥,而是单独地,那么您需要几个锁定对象。
关键是要真正了解synchronized的工作原理,并注意代码实际在做什么
答案 3 :(得分:0)
实际上,使用其中任何一个都没有任何区别,它更多的是关于选择/样式,API编写器将锁定Object - 通过synchronized(this)或显式同步任何Object方法 - 或使用内部监视器取决于共享资源,您可能不希望API用户访问您的内部锁,或者您可能希望选择API用户来共享Object内部锁。
无论哪种方式,这些选择都没有错,更多的是关于这种锁定的意图。
阅读实践中的Java并发,这将使您成为并发的主人,并澄清其中许多概念,这些概念有时与您所做的选择更相关,而不是正确性。
答案 4 :(得分:0)
每个对象只有一个内部锁。
使用synchronized关键字:如果从两个不同的线程中调用来自同一对象的两个同步方法,即使是一个线程也可以运行方法一,而另一个线程可以运行方法二,这将是没有发生,因为两个方法共享相同的内部锁(属于对象)。并且根据一个线程必须等待另一个线程完成才能获得内部锁来运行另一个方法。
但是如果你使用多个锁,你将确保一次只有一个线程可以访问一个方法,并且一次只有一个线程可以访问方法二。但是你将允许一个方法和方法二同时由一个线程访问,然后减少操作所需的时间。