2012-02-06 9 views
7

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 numbergarantito da inviare alla memoria globale e visibile a tutti i thread senza utilizzare volatile?

+0

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

+0

@Jim true, cercavo solo di fare un semplice esempio:) – Shawn

risposta

10

è il valore del numero garantito per essere trasferito nella memoria globale e visibile a tutti i thread senza utilizzare volatile?

Sì. la sincronizzazione offre anche visibilità. In realtà la sincronizzazione offre visibilità e atomicità, mentre la visibilità è volatile.

+0

Ben messo, grazie – Shawn

+3

+1: 'synchronized' può rendere' volatile' ridondante, ma non viceversa. –

+1

@Eugene: erf, giornata lenta per me qui ma ... Aspetta un secondo: non vedo * sincronizzato * nel metodo * get *. OP dovrebbe sincronizzare sia * get * e * add * altrimenti non funzionerà. AFAICT (ma è un giorno lento per me) non c'è né visibilità né atomicità nell'esempio di OP visto che * get * non sta usando alcun meccanismo di sincronizzazione ... – TacticalCoder

1

Non hai sincronizzato in modo da ottenere il codice non è thread-safe:

public int get(){ 
    return Integer.valueOf(number); 
} 

A parte questo, la sincronizzazione garantirà visibilità come già notato Eugene.

+0

buona cattura - aggiunta – Shawn

Problemi correlati