Проблема в том, что вы переназначили новый объект на простые числа [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;
}
}