У меня есть очередь с некоторым механизмом блокировки в методах «Добавить» и «Получить», где первый поток добавляет данные, а второй поток получает данные.
public synchronized MyObj getData() {
synchronized (myLock) {
synchronized (this) {
if (isEmpty()) {
wait(0);
}
}
return getData();
}
}
public synchronized void addData(MyObj data) {
if (!isFull()) {
putData(data);
synchronized (this) {
notify();
}
}
}
В приведенном выше коде, если первый поток пытается получить данные, а очередь пуста, я помещаю в ожидание через wait (0), пока другой поток не добавит данные в очередь для освобождения от ожидания через notify ().
Теперь я хочу добавить еще одну «блокировку», когда очередь заполнена, и кто-то пытается добавить к ней больше данных:
public synchronized MyObj getData() {
synchronized (myLock) {
synchronized (this) {
if (isEmpty()) {
wait(0);
}
}
synchronized (this) {
notify();
}
return getData();
}
}
public synchronized void addData(MyObj data) {
synchronized (myLock) {
synchronized (this) {
if (isFull()) {
wait(0);
}
}
}
synchronized (this) {
notify();
}
PutData(data);
}
Результат не тот, который я ожидаю, я думаю, что я получаю тупиковую блокировку, потому что процесс застрял.
ОБНОВЛЕНИЕ
Вот как я получаю данные:
queueSize--;
startPointer = (startPointer + 1) % mqueueSize;
data = (String) queue[startPointer];
вот как я добавляю данные
queueSize++;
endPointer = (endPointer + 1) % mqueueSize;
queue[endPointer] = data;
public synchronized boolean isEmpty() {
return queueSize== 0;
}
public synchronized boolean isFull() {
return queueSize== mqueueSize;
}