Этот семафор private Semaphore sema=new Semaphore(5);
допускает 5 «единиц», когда поток пытается достичь значения try{ sema.acquire(2);
, доступные «единицы» будут 5 - 2
.Затем другой поток попытается достичь значения try{ sema.acquire(2);
, и доступные «единицы» будут 5 - 2 - 2
.На данный момент доступные «единицы» равны 1
, а другие потоки пытаются получить 2
, поэтому нет доступных «единиц», и эти другие потоки будут заблокированы, пока не будет доступно по меньшей мере 2 единицы наtry{ sema.acquire(2);
.Когда один из этих потоков выпускает 2 «единицы» в sema.release(2);
, доступные «единицы» будут 5 - 2 -2 + 2
, а другой поток может получить «2 единицы» в try{ sema.acquire(2);
.
В то же время,в этих строках могут находиться два потока:
System.out.println("Available permits : " + sema.availablePermits());
Thread.sleep(3000);
Печатные сообщения не сортируются в этой точке, поэтому существуют условия гонки, которые допускают такое поведение.