Ваша логика выглядит хорошо для меня.Насколько я понимаю, 2 темы смогут получить Semaphore
в любом порядке.Любые другие потоки, пытающиеся получить данные, вернутся и будут проигнорированы.
Первый поток, который сделает synchronized
, заблокирует другой, поэтому будет работать только один поток, а один (макс.) Будет ожидать.Как только задание будет завершено и будет вызван release()
, в семафор будет добавлен другой поток.Как только блок synchronized
завершится, первый ожидающий поток начнет работать.
Другой способ сделать это - два объекта Semaphore
, в то время как второй объект делает acquire
вместоtryAcquire
.Но ваш путь должен работать.
Как указал @herschel, я бы сделал try/finally
вокруг "делай свое дело", чтобы гарантировать освобождение семафора.Что-то вроде:
...
synchronized (semaphore) {
try {
// do your stuff
} finally {
semaphore.release();
}
}