Как убедиться, что в разделе кода Java есть монитор - PullRequest
1 голос
/ 15 апреля 2011

Итак, я пишу вводную Java-программу, чтобы привыкнуть к многопоточности, однако у меня возникли небольшие проблемы с мониторами.В частности, в приведенном ниже разделе кода выдается исключение IllegalMonitorStateException, когда я выполняю вызов primes [0] .notifyAll ().

    Integer[] primes=new Integer[3];
    if(primes[0]>0{
        {
        synchronized(primes[0]){
           int returning=primes[0];
           primes[0]=0;
           primes[0].notifyAll();
           return returning;}
     }

Насколько я понимаю, ключевое слово synchronized обеспечивает то, что у вас был монитор раньшевход в блок кода, поэтому по этой логике у меня должен быть монитор для вызова notifyAll ().Я неправильно понимаю стратегию, которую использует Java для синхронизации, или есть какая-то ошибка в моей реализации?

Ответы [ 2 ]

0 голосов
/ 15 апреля 2011
Integer[] primes=new Integer[3];
if(primes[0]>0{

я ожидаю, что здесь вы получите исключения нулевого указателя, так как простые числа [0] не были выделены.

0 голосов
/ 15 апреля 2011

Проблема в том, что вы переназначили новый объект на простые числа [0].

synchronized(primes[0])

Приведенный выше оператор синхронизировался с объектом, на который ссылаются простые числа [0]

primes[0]=0;

Вышеприведенный оператор теперь переназначил новый объект на простые [0], а НЕ тот, на котором у вас есть блокировка / монитор.

primes[0].notifyAll();

Наконец, вы пытаетесь notifyAll () для нового объекта,не тот, на котором у вас есть блокировка, следовательно, исключение.

В зависимости от того, что вы пытаетесь выполнить, следующее может делать то, что вы хотите:

Integer[] primes=new Integer[3];
if(primes[0]>0) {
  synchronized(primes[0]) {
    int returning=primes[0];
    primes[0]=0;
    returning.notifyAll();
    return returning;
  }
}
...