我一直在考虑向 Java 语言架构师发送提案。
在同步块中
synchronized(lock) {
// If there is no notification before this point
// <--- implicitly put here // lock.notifyAll(); // OR // lock.notify();
}
线程离开同步块后,它不能再调用 lock.notifyAll() / lock.notify() 而不会出现异常。
忘记通知其他线程监视器持有者可能会永远让他们(其他线程)等待(除非他们在他们的等待方法中设置了一些超时)。
synchronized(lock) {
lock.wait(); //<--- this thread may forever freeze here
}
我无法想象这种行为(在同步块的末尾插入隐式通知,当没有显式通知时)是不可取的情况。
相同的方法可以应用于同步方法。
如何(技术上)实现这种行为可能有不同的方法,例如:
@autonotify
synchronized(lock) {
...
}
@autonotify
public void synchronized doSomething() {
...
}
或者:
@autonotifyAll
synchronized(lock) {
...
}
@autonotifyAll
public void synchronized doSomething() {
...
}
或者 - 使自动通知成为默认行为,但保留抑制它的能力,例如:
@suppressautonotify
synchronized(lock) {
...
}
@suppressautonotifyAll
public void synchronized doSomething() {
...
}
你怎么看?反对?
支持或反对该提案的最佳评论将被接受为答案。