作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个 Java 线程做这样的事情:
while (running) {
synchronized (lock) {
if (nextVal == null) {
try {
lock.wait();
} catch (InterruptedException ie) {
continue;
}
}
val = nextVal;
nextVal = null;
}
...do stuff with 'val'...
}
我在其他地方设置的值是这样的:
if (val == null) {
LOG.error("null value");
} else {
synchronized (lock) {
nextVal = newVal;
lock.notify();
}
}
偶尔(字面上每几百万次一次)nextVal 将被设置为 null。我输入了日志消息,我可以看到执行顺序如下所示:
我已经明确检查过锁正在第二次唤醒,它没有被中断。
我是不是做错了什么?
最佳答案
是的,Thread
自发唤醒。这在 the Javadoc 中明确说明:
“线程也可以在没有被通知、中断或超时的情况下唤醒,这就是所谓的虚假唤醒。”
您需要在循环中等待
。 javadoc 中也明确提到了这一点:
synchronized (obj) {
while (<condition does not hold>)
obj.wait(timeout);
... // Perform action appropriate to condition
}
在你的情况下:
while (running) {
synchronized (lock) {
while (nextVal == null) {
try {
lock.wait();
} catch (InterruptedException ie) {
//oh well
}
}
val = nextVal;
nextVal = null;
}
...do stuff with 'val'...
}
关于Java线程自发唤醒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16242888/
我是一名优秀的程序员,十分优秀!