我试图修复一段我写的代码,目前有竞争条件。在这样做时,我需要将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你说的很对,我觉得睡眠不足已开始显现!谢谢。 –
我没有得到什么“同步使用”应该完成。如果不是这样,你有一个线程从流中读取并插入到多个使用者使用的阻塞队列中? –