【问题标题】:Synchronization - Difference between locks [duplicate]同步 - 锁之间的区别[重复]
【发布时间】:2014-09-30 05:06:53
【问题描述】:

以下并发锁的方法有什么区别?

public synchronized ArrayList<Player> getPlayers() {
     return players;
}

public ArrayList<Player> getPlayers() {
     synchronized(players) {
          return players;
     }
}

public ArrayList<Player> getPlayers() {
     synchronized(GameHandler.class) {
          return players;
     }
}

我们如何决定在哪些场景中应该使用哪一个?

编辑:

我已经编辑了我的主题标题和帖子以证明这不是重复的。谢谢。

【问题讨论】:

  • 没有区别,这三个方法在任何时候都只允许单个线程访问players
  • 采用三种方式的意义何在?
  • 您可以在这里得到答案:stackoverflow.com/questions/20906548/…
  • OK,这些方法的结果都是一样的。
  • 如果您不认为这是重复的,请对其进行编辑以明确不同之处。然后它将进入重新打开审核队列。

标签: java multithreading


【解决方案1】:

在我回答你的问题之前,请注意 void 方法不能返回 ArrayList。

问题是:它们获得的锁不同。

在这种情况下,第一个是对“this”的隐式锁定。这是一种写法

public void getPlayers() {
    synchronized (this) {
        return list;
    }
}

除了它是一个方法修饰符。

在第二个示例中,您显式锁定了要返回的 ArrayList。这在竞争锁中很常见,用更本地化的粒度切换实例锁。

在第三个示例中,您锁定了 Class。这通常是静态方法的首选,在这种情况下无法获取实例(试一试,不能使用“this”作为值)。这几乎等同于锁定一个静态的 final Object 字段,因为 Class 对象理论上不应该改变。

【讨论】:

  • 我知道 void 不能返回 ArrayList。这就是我编辑它的原因。谢谢你的回答。
  • 很多刚接触 Java 特定领域的人都会遇到这种情况。我尽我所能帮助人们,但最终,你也要对并发进行研究。我亲自阅读了 Java Concurrency In Practice,它是任何 Java 开发人员的必读书籍,因为随着 CPU 能力未被单线程应用程序充分利用,多线程将变得越来越重要。
  • 好答案,好态度,好幽默(无知!)......所以有一个plussie!你不是一个很好的巨魔,是吗? ;)
  • 我作为巨魔的工作不是巨魔,那就是巨魔:P
猜你喜欢
  • 2015-07-25
  • 1970-01-01
  • 1970-01-01
  • 2017-08-14
  • 2011-09-02
  • 1970-01-01
  • 1970-01-01
  • 2014-04-27
  • 2021-10-16
相关资源
最近更新 更多