У меня есть два объекта в разных потоках с использованием одного и того же байтового буфера. Они оба имеют следующий метод:Java-тупик с одним замком
synchronized(buffer)
{
...
if (...)
buffer.wait();
...
buffer.notifyAll();
...
}
Оба объекта никогда не будут ждать в то же время. Это может привести к блокировке. Как мне это обработать?
РЕДАКТИРОВАТЬ:
Эти объекты реализации трубопроводных входных и выходных потоков.
Метод в централизованном классе выходного потока:
@Override
public void write(byte[] b, int off, int len) throws IOException
{
synchronized(sink.buffer)
{
if (sink.writepos == sink.readpos && sink.writelap == (sink.readlap + 1))
{
try
{
sink.buffer.wait();
}
catch(InterruptedException e)
{
throw new IOException(e.getMessage());
}
write(b, off, len);
return;
}
int amount = Math.min(len, (sink.writepos < sink.readpos ? sink.readpos : sink.buffer.length) - sink.writepos);
System.arraycopy(b, off, sink.buffer, sink.writepos, amount);
sink.writepos += amount;
if (sink.writepos == sink.buffer.length)
{
sink.writepos = 0;
sink.writelap++;
}
if (amount < len)
write(b, off + amount, len - amount);
else
sink.buffer.notifyAll();
}
}
Метод в централизованном классе входного потока:
@Override
public int read(byte[] b, int off, int len) throws IOException
{
synchronized(buffer)
{
if (readpos == writepos && readlap == writelap)
{
try
{
buffer.wait();
}
catch(InterruptedException e)
{
throw new IOException(e.getMessage());
}
return read(b, off, len);
}
int amount = Math.min(len, (writepos > readpos ? writepos : buffer.length) - readpos);
System.arraycopy(buffer, readpos, b, off, amount);
readpos += amount;
if (readpos == buffer.length)
{
readpos = 0;
readlap++;
}
if (amount < len)
{
int next = read(b, off + amount, len - amount);
return amount + next;
}
else
{
buffer.notifyAll();
}
return amount;
}
}
Мы должны знать, почему вы хотите, чтобы эти потоки, чтобы ждать, чтобы быть в состоянии правильно ответить на этот вопрос. – Vitruvius
@Saposhiente Я добавил код методов. – Kalinovcic
Вы предполагали, что методы должны быть рекурсивными? Вы получаете исключение стека? 'write' вызывает' write', вероятно, неопределенно? –