我有從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");
}
但是這個函數不正確,因爲在ThreadB沒有開始等待的時刻,ThreadA可以讀取數據並通知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。
你需要使用等待/通知? – maasg
我已經編輯了你的代碼來修正格式,但是似乎有些問題。你可以重寫和編輯你的文字來解釋你想要做什麼嗎? – Gray
Java 5引入了許多有用的併發構造......我相信其中一個將會優雅地解決這個問題。最好在程序員的問題上對設計進行白板。 –