Использование блокировок синхронизации в Java - PullRequest
2 голосов
/ 07 марта 2011

Я возился с синхронизацией в Java, и это все еще не работает для меня.

У меня есть два объекта Runnable, которые используются для создания отдельных потоков, и у каждого объекта есть дескриптор общего ArrayList и общего объекта (для использования в синхронизированных). Первый Runnable всегда читает одну переменную экземпляра для всех Объектов в списке массивов, а второй Runnable постоянно обновляет переменные экземпляра для всех Объектов в списке массивов.

Как я сейчас его настроил, оба объекта Runnable содержат указатель на объект, который я собирался использовать в качестве блокировки.

Работоспособен 1:

public void run() {
    if (syncLock == null)
        return;
    synchronized (syncLock) {
        try {
            syncLock.wait();
        } catch (InterruptedException e) {
        }

        for (int i = 0; i < list.size(); i++) {
            drawItem(list.get(i));
        }
        syncLock.notify();
    }
}    

Runnable 2:

public void run() {
    if (syncLock == null)
        return;
    synchronized (syncLock) {
        try {
            syncLock.wait();
        } catch (InterruptedException e) {
        }

        for (int i = 0; i < list.size(); i++) {
            updateItem(list.get(i));
        }
        syncLock.notify();
    }
}    

Технически, первый Runnable всегда рисует объекты на экране, а второй вычисляет новую позицию элементов на основе изменения во времени.

Что-то, чего мне не хватает?

1 Ответ

5 голосов
/ 07 марта 2011

Похоже, что оба ваших потока начнутся и застрянут в wait(), если только у вас нет какого-то другого объекта, который вы там не показываете, notify() одному из них (просто чтобы начать их). Вы ' Я должен быть уверен, что оба потока ожидают.

В качестве альтернативы вы можете сначала изменить одного из них, чтобы он выполнял свою работу, затем позвонить notify(), затем wait(). Опять же, вы должны быть уверены, что другой поток уже ждет.

...