robin1 ha scritto:
La sincronizzazione deve avvenire solo tra le coppie in round robin , nel senso : P0-P1 (anche simultaneamente) , e solo dopo che una coppia ha finito, la coppia successiva può iniziare l'inserimento.
La classe Deposito, così come è scritta sopra, NON è thread-safe. Cioè non può essere usata da più thread. Se vuoi renderla thread-safe, il minimo da fare è mettere
synchronized sui due metodi (e su altri che eventualmente inserirai dopo). Questo porta alla mutua-esclusione tra i thread, ovvero ciascun metodo diventa "atomico" e può essere eseguito da un solo thread per volta.
Perché come ti ho detto prima, se si tratta di modificare uno stesso "stato" da parte di più thread (e specialmente con una collezione "semplice" come ArrayList), il "simultaneo"
non esiste. Solo un thread per volta può modificare il ArrayList, non si può fare diversamente.
Quindi innanzitutto devi stabilire se ti va bene qualunque sequenza all'interno della coppia, P0 poi P1 oppure P1 poi P0. O se invece vuoi garantire una sola sequenza ben precisa (es. la prima).
Stabilito questo, se vuoi fare una classe esterna a Deposito che coordina i produttori (e che
dovrà essere usata da TUTTI i produttori, per coerenza/correttezza), si può fare. Puoi anche stabilire se questa classe esterna dovrà solo coordinare i thread-produttori ma poi essi invocheranno direttamente i metodi di Deposito oppure se Deposito lo incapsuli nella classe di sincronizzazione e i produttori usano Deposito indirettamente.