为什么Java 8没有将`withLock`默认方法添加到`java.util.concurrent.locks.Lock`接口?

rxg*_*rxg 6 locking java-8 default-method

这个问题一样,我想知道为什么Java团队没有为Lock接口添加一些默认方法,如下所示:

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

  try {
     r.run();
  } finally {
     unlock();
  }
}
Run Code Online (Sandbox Code Playgroud)

这将允许程序员这样做

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())); });
  }
}
Run Code Online (Sandbox Code Playgroud)

代替

public void threadSafeMethod {
  lock.lock();
  try {
    System.out.println(l.get(l.size())); 
  } finally { 
    lock.unlock();
  }
}
Run Code Online (Sandbox Code Playgroud)

rxg*_*rxg 6

似乎这个问题的答案类似于相关问题的答案- 由于Runnablelambda创建的分配成本(参见Brian Goetz对请求的回应),它被视为"有吸引力的滋扰" .

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