何时使用私有锁对象来同步一个块?
Object lock =new Object();
synchronized(lock)
{ }
何时使用客户端锁来同步块?
private final List<InetAddress> ips =
Collections.synchronizedList(new ArrayList< InetAddress >());
synchronized(ips)
{ }
为什么客户端锁不是首选?
何时使用私有锁对象来同步一个块?
Object lock =new Object();
synchronized(lock)
{ }
何时使用客户端锁来同步块?
private final List<InetAddress> ips =
Collections.synchronizedList(new ArrayList< InetAddress >());
synchronized(ips)
{ }
为什么客户端锁不是首选?
该对象必须在类方法中的同步块中显式用于锁定目的。此内在锁与私有对象的实例相关联,而不是与类相关联。因此,此类的方法和敌对类的方法之间没有锁争用(因为将对象锁声明为私有和最终的是一个好习惯)。
在客户端锁定中,类持有对其他类可能访问的对象的锁定。客户端锁定需要保护使用某个对象 X 的客户端代码以及 X 用来保护其自身状态的锁。为了使用客户端锁定,您必须知道 X 使用什么锁。客户端锁定更加脆弱,因为它需要将一个类的锁定代码放入与该特定类完全无关的类中。
例如,如果一个类 A 具有使用方法同步的方法。另一个类 B 具有对类 A 的引用,并使用类 A 的对象作为锁来同步方法中的块。如果有一天 A 类的锁定策略被修改为使用私有的最终锁定对象,那么 B 类的锁定策略就会中断,因为调用 A 类方法的线程将遵循新的锁定策略,而 B 类中的方法仍然使用A 类作为锁。因此,实现将使用两个不同的锁。