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

私有锁对象和内部锁
EN

Stack Overflow用户
提问于 2013-11-07 15:58:54
回答 5查看 1.4K关注 0票数 1

什么时候更喜欢私有锁对象来同步块而不是内部锁(这个)?请列举这两方面的成果。

专用锁对象:-

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

内在锁(此):-

代码语言:javascript
复制
synchronized(this)
{  }
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-11-07 16:08:15

使用显式lock对象可以允许不同的方法在不同的锁上同步,并避免不必要的争用。它还使锁更加显式,并且可以更容易地搜索使用锁的代码块。

不过,你可能也不想这样做!在java.util.concurrent中找到适当的类并使用它。:)

票数 1
EN

Stack Overflow用户

发布于 2013-11-07 16:05:35

当您正在执行某种类型的锁切分时,私有锁可能很有用,也就是说,您只需要锁定对象的某些部分,而其他部分仍然可以由其他客户端访问。

理解这一概念的一个简单的并行方法是数据库中的表锁:如果您正在修改一个表,您将获得该单个表的锁,而不是整个数据库的锁,因此其他客户端可以修改其余的表。如果您需要实现类似的逻辑,但是在POJO中,您将根据需要使用尽可能多的私有锁。

这种方法的一个缺点是,您的类会被许多对象弄得乱七八糟。这可能表明您需要使用更简单的锁定策略在一组更细粒度的类中重构它,但这完全取决于您的设计和实现。

票数 0
EN

Stack Overflow用户

发布于 2013-11-07 16:06:11

这两种方法都使用内部锁。第一个例子是使用lock的内部锁,第二个例子是使用this的内在锁。问题是,this是否真的是您想要锁定的东西,而它通常不是。

当您在一个方法中使用synchronized(this)时,请考虑这种情况。这个类有两个对象,这些对象引用一些共享资源。如果您锁定了this,那么您将不会对该资源具有相互的排他性。您需要锁定可以访问资源的所有对象都可以访问的对象。

只有当重要资源是类本身的一部分时,才锁定this。即使在某些情况下,锁对象也更好。另外,如果您的类中有几个不同的资源,这些资源不需要作为一个整体相互排斥,而是单独地,那么您需要几个锁对象。

关键是要真正了解已同步是如何工作的,并且要注意您的代码实际上在做什么。

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

https://stackoverflow.com/questions/19840594

复制
相关文章

相似问题

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