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)
似乎这个问题的答案类似于相关问题的答案- 由于Runnable
lambda创建的分配成本(参见Brian Goetz对请求的回应),它被视为"有吸引力的滋扰" .
好消息是这个请求有一个开放的错误,这意味着一旦JVM可以可靠地最小化分配成本,Oracle似乎愿意重新审视这个决定.