Il vector ti garantisce che le operazioni di scrittura e lettura siano esclusive da parte di un solo thread per volta. Le altre strutture dati non te lo garantiscono, quindi la risposta alla tua domanda è "si!". Sia ben chiaro che la sincronizzazione si riferisce esclusivamente alla struttura dati e non al suo contenuto.
Allora io continuo a non capire una cosa, forse non sono stato chiaroo sono io confuso... Riporto da questa fonte [http://www.ateneonline.it/hyperbook/j_book/J1002.htm]:
In Java tale meccanismo è stato automatizzato quanto più possibile; ogni istanza di qualsiasi oggetto ha associato un mutex. Quando un thread esegue un metodo che è stato dichiarato sincronizzato mediante il modificatore synchronized, entra in possesso del mutex associato all’istanza e nessun altro metodo sincronizzato può essere eseguito su quell’istanza fintanto che il thread non ha terminato l’esecuzione del metodo
Invocando due metodi statici sincronizzati di una stessa classe da due thread diversi, essi verranno quindi eseguiti in sequenza mentre invocando un metodo statico e un metodo d’istanza, entrambi sincronizzati, di una stessa classe, essi verranno eseguiti contemporaneamente
Nella classe vector i metodi che modificano la struttura dati (.get()/.remove()...) non sono sicuramente statici e quindi non ci dovrebbe essere mutua esclusione tra istanze differenti della classe (diversi oggetti Vector di diverse classi)..
La mia paura, come si volevo scrivere sopra, è che l'esecuzione da parte di un thread di una istruzione su un deveterminato oggetto Vector (magari una scrittura molto lunga) blocchi l'esecuzione di un altra operazione su un altro Vector differente (magari in lettura).
Stavo costruendo in alternativa una classe "Semaforo" di base, con due metodi sincronizzati p() e v() per poter gestire la differente sincronizzazione nelle diverse parti del programma. Istanziando oggetti Semaforo differenti sono sicuro che i diversi thread che eseguano una differente istanza di semaforo non si escludano a vicenda??
Con la classe impostando un valore del semaforo elevato potrei permettere di eseguire letture multiple su una struttura dati come un ArrayList a differenza della lettura del Vector?
Ecco un po' di codice del mio Semaforo
codice:
public class Semaforo{
public int valore;
public String nome;
public int numThr;
public Semaforo(int val, String identif){
valore= val; nome= identif; numThr=0;
}
public Semaforo(String identif){ this(0,identif); }
//Metodo che ricerca di ottenere la risorsa condivisa
public synchronized void p(){ /
/finche' non ci sono risorse condivise rimango in attesa while (valore==0){ try{
wait();
}catch(InterruptedException e){}
}
//dato che e' disponibile una risorsa prendo un valore
valore--; numThr++;
}
public synchronized void v(){
//rilascio la disponibilita' di una risorsa che puo' essere presa da altri
valore++; numThr--;
//messaggio di notifica di rilascio della risorsa
notify();
}
public String getNome(){ return nome; }
public int getNumThr(){ return numThr; }
public int getValore(){ return valore; }
public void setValore(int i){ valore= i; } }
Sono stato un po' confusionario, scusatemi