私有锁对象和客户端锁

时间:2013-11-07 13:16:18

标签: java multithreading synchronized locks

何时使用私有锁对象来同步块?

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

何时使用客户端锁定同步块?

private final List<InetAddress> ips =
Collections.synchronizedList(new ArrayList< InetAddress >());  
synchronized(ips)
{  }

为什么不首选客户端锁定?

1 个答案:

答案 0 :(得分:1)

对象必须在类的方法中的synchronized块中显式用于锁定目的。此内部锁与私有对象的实例相关联,而不与类相关联。因此,此类的方法与恶意类的方法之间没有锁争用(因为将对象锁声明为私有和最终的是一种很好的做法)。

在客户端锁定中,类保持对其他类可以访问的对象的锁定。 客户端锁定需要保护使用某个对象X的客户端代码,其中锁X用于保护自己的状态。为了使用客户端锁定,您必须知道X使用什么锁。 客户端锁定更加脆弱,因为它需要将类的锁定代码放入与该特定类完全无关的类中。

例如,如果类A具有使用方法同步的方法。另一个类B具有对类A的引用,并使用类A的对象作为锁来同步方法中的块。 如果有一天A类的锁定策略被修改为使用私有的最终锁定对象,那么类B的锁定策略就会中断,因为调用类A的方法的线程将遵循新的锁定策略,而类B中的方法仍然使用对象A类作为锁。因此,实现将使用两个不同的锁。