首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >私有锁对象和客户端锁

私有锁对象和客户端锁
EN

Stack Overflow用户
提问于 2013-11-07 13:16:18
回答 1查看 501关注 0票数 0

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

代码语言:javascript
复制
Object lock =new Object();  
synchronized(lock)
{  }

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

代码语言:javascript
复制
private final List<InetAddress> ips =
Collections.synchronizedList(new ArrayList< InetAddress >());  
synchronized(ips)
{  }

为什么客户端锁不是首选的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-08 08:59:48

必须显式地使用对象来锁定类方法中的同步块。这个内部锁与私有对象的实例而不是类相关联。因此,该类的方法与敌对类的方法之间没有锁定争用(因为将对象锁声明为私有和最终的是一种很好的做法)。

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19836963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档