2015-09-01 11 views
6

È possibile che Thread 2 stampi "x = 0"?È possibile che Thread 2 stampi "x = 0"?

int x = 0; 
boolean bExit = false; 

Thread 1 (not synchronized) 
x = 1; 
bExit = true; 

Thread 2 (not synchronized) 
if (bExit == true) 
System.out.println("x=" + x); 
+0

Sì, è possibile, poiché non sono presenti/impliciti accade prima che vengano stabilite relazioni. (Anche se il codice più completo dovrebbe essere generalmente incluso in tale domanda, preferibilmente quello che viene eseguito.) – user2864740

+0

@Dhaval: Pls accetta la risposta se la tua domanda ha una risposta. –

risposta

7

È possibile per Thread 2 per stampare “x = 0”?

se le istruzioni vengono riordinate dal compilatore JIT come:

Filettatura1:

bExit=true 
x=1 

Thread2:

if (bExit == true) System.out.println("x=" + x); //prints 0 

Quando si utilizza blocco sincronizzato (o altri costrutti correlati) le istruzioni non vengono riordinate dal compilatore.

+1

Potrebbe valere la pena sottolineare che questo sarebbe il compilatore JIT, non javac. –

+0

perché l'istruzione di thread1 cambierà ordine? Non ho capito la risposta, puoi aggiungere ulteriori dettagli per favore? –

+0

La CPU potrebbe anche riordinare le istruzioni. – ZhongYu

2

Risposta: Sì, è possibile che il filo T2 possa stampare x = 0. Perché? perché senza alcuna istruzione al compilatore, ad es. sincronizzato o volatile, bExit = true potrebbe venire prima di x = 1 nel riordino del compilatore. Anche x = 1 potrebbe non diventare visibile in Thread 2, quindi Thread 2 caricherà x = 0. Ora, come lo aggiustate? Quando ho posto questa domanda a un paio di programmatori che rispondono in modo diverso, uno suggerisce di rendere entrambi i thread sincronizzati su un mutex comune, un altro dice rendere entrambe variabili variabili. Entrambi sono corretti, in quanto impediscono il riordino e garantiscono la visibilità. Ma la migliore risposta è che devi solo rendere bExit come volatile, quindi Thread 2 può solo stampare "x = 1". x non ha bisogno di essere volatile perché x non può essere riordinato per venire dopo bExit = true quando bExit è volatile.

Problemi correlati