Koi_jp
@Koi_jp

Может ли симафор в Java вообще не давать разрешений?

вот задачка на "производителя-потребителя". не понимаю как semCon может разрешать вход, есди у него кол-во разрешений равно 0?

import java.util.concurrent.Semaphore;

/**
 * Created by Dell on 16.09.2014.
 */
public class Exchanger {

    volatile int someRandomValue;
    volatile boolean isFilled = false;
    Semaphore semProd = new Semaphore(1);
    Semaphore semCon = new Semaphore(0);

     void put(int n){
            try {
                semProd.acquire();
            }
            catch (InterruptedException e){
                e.printStackTrace();
            }
            someRandomValue = n;
            System.out.println("Сгенерировано значение " + someRandomValue);
            semCon.release();
    }

     int read(){
            try{
                semCon.acquire();
            }
            catch (InterruptedException e){
                e.printStackTrace();
            }
             System.out.println("Считано занчение " + someRandomValue);
             semProd.release();
             return someRandomValue;
    }
}
  • Вопрос задан
  • 2339 просмотров
Решения вопроса 1
UbuRus
@UbuRus
Вы сначала вызвали put(n), а потом read()?
У вас опечатка:
semCon.release(); - должно быть semProd.release();
а semProd.release(); - должно быть semCon.release();

Т.е. в конце метода put, вы разрешаете одну acquire в семафор semCon и потом в методе read() делаете acquire в него, если вы вызовете read() и put(n) в обратном порядке, то тогда вы зависните в блоке try метода read.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
27 нояб. 2024, в 17:41
2000 руб./за проект
27 нояб. 2024, в 17:26
1 руб./за проект
27 нояб. 2024, в 17:17
3000 руб./за проект