我有将通知发送ThreadB
到线程ThreadA
并等待通知从ThreadA
返回到ThreadB
.
在这期间,由读取数据A
通知B
,然后B
由A
ThreadA
读取ThreadB
数据通知,并在完成时向 发送通知ThreadB
。
sendNotifyAndWaitNotify 在 ThreadB 中运行。
在同一个对象上逐一同步可能看起来很奇怪,但B.sync.notify();
只有在它退出同步块时才会发送通知,如果我将在一个块中写入所有内容,我将首先等待,只有在退出同步块时才会发出通知。这是不可接受的。
void sendNotifyAndWaitNotify() {
synchronized(B.sync) {
B.sync.notify();
}
//ThreadA reads ThreadB data
synchronized (B.sync) {
try {
debug("start waiting for notify");
B.sync.wait();
} catch (Exception e) {
error( e.toString());
}
}
debug("reader sleep done");
}
但是这个函数是不正确的,因为ThreadA可以在ThreadB没有启动等待的那一刻读取数据并通知ThreadB。是否可以通过交叉同步块来解决问题,如下所示:
void sendNotifyAndWaitNotify()
{
synchronized(B.sync) // block #1
{
synchronized(B.sync) // block #2
{
B.sync.notify();
}
//ThreadA reads ThreadB data
try
{
debug("start waiting for notify");
B.sync.wait();
} catch (Exception e) {
error( e.toString());
}
debug("reader sleep done");
}
}
我希望 ThreadA 在退出同步块 #1 而不是 #2 后会被唤醒。而且我希望块#2中的代码也许第二个块更好地用于不同的同步对象?
我必须使用 java 1.4。