何时使用私有锁对象同步块?
Object lock =new Object();
synchronized(lock)
{ }何时使用客户端锁同步块?
private final List<InetAddress> ips =
Collections.synchronizedList(new ArrayList< InetAddress >());
synchronized(ips)
{ }为什么客户端锁不是首选的?
发布于 2013-11-08 08:59:48
必须显式地使用对象来锁定类方法中的同步块。这个内部锁与私有对象的实例而不是类相关联。因此,该类的方法与敌对类的方法之间没有锁定争用(因为将对象锁声明为私有和最终的是一种很好的做法)。
在客户端锁定中,类对其他类可能访问的对象持有锁。客户端锁定需要保护客户端代码,这些代码使用某些对象X和锁X来保护自己的状态。为了使用客户端锁定,您必须知道X使用什么锁。客户端锁定更加脆弱,因为它需要将类的锁代码放入与特定类完全无关的类中。
例如,如果A类有使用方法的方法,则synchronization.Another类B对A类有引用,并使用A类的对象作为锁来同步方法中的块。如果有一天A类的锁定策略被修改为使用私有的最终锁对象,那么B类的锁定策略就会中断,因为调用A类方法的线程将坚持新的锁定策略,而B类中的方法仍然使用A类的对象作为锁。因此,实现将使用两个不同的锁。
https://stackoverflow.com/questions/19836963
复制相似问题