Ну, единственная проблема, которую я вижу, это эта часть:
if( counter == 0 )
{
try
{
wait();
}
catch(InterruptedException e) { }
}
counter--;
Если поток прерывается во время ожидания, он просто выйдет из оператора if
, уменьшит счетчик ниже 0, а затем ваша семафорная система пойдет ужасно неправильно, поскольку теперь никто не будет вынужден ждать, потому что counter
меньше 0.
Вам, вероятно, следует заменить if
на while
, на всякий случай.