Dire che ho il seguente codice:Il blocco effettivo è importante quando si decide di utilizzare volatile?
private Integer number;
private final Object numberLock = new Object();
public int get(){
synchronized(number or numberLock){
return Integer.valueOf(number);
}
}
La mia domanda è, effettuare le seguenti versioni del metodo add
bisogno di avere number
come volatile nei seguenti casi:
public void add(int num){
synchronized(number)
number = number + num;
}
public void add(int num){
synchronized(numberLock)
number = number + num;
}
Capisco che queste siano entrambe operazioni atomiche, ma la mia domanda è, è il valore di number
garantito da inviare alla memoria globale e visibile a tutti i thread senza utilizzare volatile?
Probabilmente la sincronizzazione con il numero non è una buona idea, gli oggetti Integer (can) possono essere memorizzati nella cache e questo bloccherà altri codici che si sincronizzano sullo stesso numero. – Jim
@Jim true, cercavo solo di fare un semplice esempio:) – Shawn