7

この質問と同じように、Java チームがLockインターフェースに次のようないくつかのデフォルト メソッドを追加しなかったのはなぜだろうかと思います。

public default void withLock(Runnable r) {
  lock();

  try {
     r.run();
  } finally {
     unlock();
  }
}

これにより、プログラマーは次のことができるようになります

public class ThreadSafe {
  // Object requiring protection
  private final List<String> l = new ArrayList<>();
  private final Lock lock = new ReentrantLock();

  public void mutate(String s) {
    lock.withLock(() -> l.add(s));
  }

  public void threadSafeMethod {
    lock.withLock(() -> { System.out.println(l.get(l.size())); });
  }
}

それ以外の

public void threadSafeMethod {
  lock.lock();
  try {
    System.out.println(l.get(l.size())); 
  } finally { 
    lock.unlock();
  }
}
4

1 に答える 1

6

これに対する答えは、リンクされた質問への答えに似ているようです-Runnableラムダから作成されたの割り当てコストのために、「魅力的な迷惑」と見なされました(要求に対するBrian Goetzの応答を参照)。

幸いなことに、このリクエストには未解決のバグがあります。つまり、JVM が割り当てコストを確実に最小限に抑えることができれば、Oracle はこの決定を再検討することを受け入れるようです。

于 2014-06-04T09:51:56.403 に答える