【发布时间】:2013-04-08 19:08:21
【问题描述】:
我一直在考虑向 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() {
...
}
你怎么看?反对?
将接受支持或反对提案的最佳评论作为答案。
【问题讨论】:
-
在很多情况下,这样做会导致错误(或者至少在未满足等待条件时会导致不需要的唤醒)。并非所有同步都已完成以通知监视器。
标签: java multithreading thread-safety