violet_prog ha scritto:
Eppure il notify lo chiamo su q.get(i) di cui il metodo possiede il mutex
Riguardo la ElemObj, l'hai fatta come "inner class". Non è strettamente necessario (non deve usare nulla della classe "contenitore"). La puoi mettere come "nested (static) class".
Il punto è che se è una inner class, il <T> di BlockingArray è visibile e in scope. Se la metti come nested static class, NON lo è, devi dichiarare una nuova type variabile e idem, per evitare confusione, meglio mettere un'altra lettera es. <E>
Poi:
q.add(i, new ElemObj(x));
NON ha senso. Non devi aggiungere un nuovo ElemObj ma semplicemente settare il elem interno a quello su cui tenevi il lock. Se crei un nuovo ElemObj rischi di mandare tutto a pallino (altro oggetto, lock differente!).
ElemObj x=q.remove(i);
Idem. NON devi rimuovere.
Ah:
q=new ArrayList(n);
stai usando il raw type. E' più corretto:
q=new ArrayList<ElemObj>(n);
o da Java 7:
q=new ArrayList
<>(n);