我試圖修復一段我寫的代碼,目前有競爭條件。在這樣做時,我需要將while
循環的條件放在塊中,但是我不想同步整個while
塊,因爲這會使資源的其他線程捱餓,而這些線程都是他們需要的。我無法找到一個合理的方式,在沒有重複的情況下或者在略微模糊控制流的地方進行。下面的問題是代碼的要點:while循環的條件的同步塊
while ((numRead = in.read(buffer)) != -1) {
out.write(buffer);
}
,我需要使用in
同步。我能想到的(但不認爲他們是非常好的)兩個可能的解決方案是:
synchronized (this) {
numRead = in.read(buffer);
}
while (numRead != -1) {
out.write(buffer);
synchronized (this) {
numRead = in.read(buffer);
}
}
具有不良的重複,這:
while (true) {
synchronized (this) {
numRead = in.read(buffer);
}
if (numRead == -1)
break;
else
out.write(buffer);
}
這是不是偉大的可讀性。有什麼建議麼?
你可以換行讀取調用的方法調用與同步塊(或方法本身可以同步) – mszymborski
@mszymborski你說的很對,我覺得睡眠不足已開始顯現!謝謝。 –
我沒有得到什麼「同步使用」應該完成。如果不是這樣,你有一個線程從流中讀取並插入到多個使用者使用的阻塞隊列中? –