Многопоточность с семафором - PullRequest
1 голос
/ 22 ноября 2011

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

public void run() {
     System.out.println("Step 1");
     semaphoreA.acquire();

     // Run for a while

     semaphoreA.release();

     // Run for a while

     semaphoreB.acquire();
     System.out.println("Step 2");

     // Run for a while

     semaphoreB.release();
}

Итак, когда нет разрешения на семафор B, поток ожидает. Однако, когда разрешение становится доступным, я не должен увидеть «Шаг 2» на консоли? Или так работает нить и семафор?

Я хочу понять, что произойдет, если поток будет только что уведомлен о доступном разрешении семафора. Будет ли этот поток начаться с самого начала? или с той точки, где от нее осталось?

1 Ответ

0 голосов
/ 22 ноября 2011

Предполагая, что вы создали экземпляры семафоров и семафоров с новым семафором (1, true), в лучшем случае вы увидите:

Шаг 1

Шаг 2

Если какой-то другой поток получает семафор, пока он не будет освобожден, этот поток просто ждет, где он находится. Другими словами, вы никогда не будете Шаг 1 один раз, но никогда дважды. Вы можете видеть или не видеть Шаг 2 в зависимости от того, выпущен ли какой-либо из семафоров.

...