我们有两个线程,Thread2 等待 Thread1(从它接收消息)
class Thread1 .. {
run() {
synchronized(this) { some-work; notify(); }
}
}
class Thread2 .. {
run() {
while(true) {
synchronized(thread1) {
...
thread1.wait();
...
println("Got here"); // has received the notify() from Thread1
}
}
}
}
- thread2.start() // thred2首先准备好接收来自thread1的所有消息
- 线程1.start()
在按顺序启动这些线程后,我们遇到了 thread2 正在等待来自 thread1 的 notify() 的情况,这将在几分钟内发生 - 将出现消息“到达这里”。
但是,如果我在这里延迟:
class Thread2
run() {
while(true) {
sleep(1000); // the dalay
synchronized(thread1) { ..
}
然后消息'Got Here'将永远不会出现 - 因为 thread2 在达到 sycnronized(thread1) 之前会错过来自 thread1 的 notify() - 然后我们就会遇到Nothing To Wait的情况。
问题是:
1.这两行是原子的吗?或者更好地说,这两行之间的差距是原子的?:
while(true) {
// gap
synchronized(thread1) {..thread.wait() ..}
}
2. 或者这是否意味着我们不应该在 while() 和同步块之间放置任何表达式?例如,我们可以:
while(true) {
int a = 0; a++;
synchronized(thread1) {..thread.wait() ..}
因为我们在那里有这些表达,那么我们就有“无所事事”情况的风险?