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从 lambda 创建的分配成本,它被认为是“有吸引力的麻烦”(请参阅​​ Brian Goetz对请求的响应)。

好消息是这个请求有一个开放的错误,这意味着一旦 JVM 可以可靠地最小化分配成本,Oracle 似乎愿意重新考虑这个决定。

于 2014-06-04T09:51:56.403 回答