2

众所周知,建议在最终私有对象上进行同步(而不是在this数据protected成员上同步)。

但是当我的应用程序中有多个类(模块)需要在一个公共对象上同步时会发生什么?

有没有办法调和这两个看似矛盾的要求?

为了更好地解释,如果我有一个类的私有数据成员Owner定义为:

private final Object $01pfo = new Object[0]; 

然后任何方法都Owner可以简单地使用它:

  protected void anyMethod()  {
    synchronized ($01pfo) {
          // do your thing
    }
  }

但是如果我想$01pfo从不同的类(比如User)同步,我唯一的选择是$01pfo保护还是公开?

protected final Object $01pfo = new Object[0]; 

有更好的方法吗?或解决方案?

4

3 回答 3

3

我考虑使用关键字的包隐私protected作为黑客。在您的用例中,这些类似乎正在协作以同步方式执行特定任务。我将在启动此任务的类/方法中定义一个 Lock 对象,并通过作为构造函数参数传递,显式地将Lock对象提供给所有涉及的类。

于 2012-09-20T18:42:21.613 回答
2

如果同步块没有分布在多个对象中,它们会很好地工作。

如果您需要在多个类中使用单个锁来同步操作 - 最好查看 Lock实现。

它将为您提供更多的自由来细化对多个线程中的资源的访问

于 2012-09-20T19:20:48.980 回答
0

您提供的链接清楚地说明了考虑私有最终而不是这种情况的情况:

  • 我们正在谈论实例同步;
  • 如果您需要除 synchronized(this) 之外的锁定粒度,则 synchronized(this) 不适用,因此这不是问题。

当您需要另一个粒度时,请随意使用另一个同步对象。顺便说一句,在你的例子中,

 private final Object $01pfo = new Object() 

就足够了。

于 2012-09-20T18:55:03.897 回答