2010-11-19 13 views
5

vedo questo:Va bene? Sincronizzato (thread), quindi infilare = null nel blocco sincronia

// thread is a member of this class 

synchronized(this.thread) 
{ 
    this.thread.running = false; 
    this.thread.notifyAll(); // Wake up anything that was .waiting() on 
    // the thread 
    this.thread = null; // kill this thread reference. 
    // can you do that in a synchronized block? 
} 

E 'ok per impostare il thread=null pur mantenendo un blocco su di esso?

Ho trovato questo nugget in un po 'di codice BB.

+1

C'è qualche ragione per cui non si utilizza Thread.interrupt() poiché questo è supportato dalle librerie sottostanti? –

risposta

7

Sì, va bene. L'istruzione sincronizzata prenderà una copia del riferimento su cui si sta bloccando e userà la copia per capire cosa sbloccare alla fine.

Section 14.19 del linguaggio Java Specification non è in realtà chiaro su questo, ma fa affermano che l'espressione viene valutata alla partenza - e non menziona la valutazione di nuovo in seguito.

+0

Va bene, ma è discutibile se impostare il riferimento del filo su null sia una buona idea. – Adamski

+1

@Adamski: Tendo ad avere una visione ragionevolmente forte su ciò che sincronizzo in primo luogo per essere onesto - ho pensato di evitare di entrare in questo :) –

+0

Concordato - In realtà IntelliJ mi avverte in questa situazione sulla sincronizzazione in corso una variabile non finale. – Adamski

3

C'è una differenza:

synchronized(this.thread) 

si sincronizza sul oggetto campo this.thread punti per

this.thread = null; 

Stai riassegnando il campo. Non stai facendo nulla con l'oggetto di cui sopra, quindi il blocco è ancora valido.

0

Si può fare, ma è quasi certo che il codice sia sbagliato per qualsiasi cosa stia cercando di ottenere. Pubblica l'intero codice e ti garantisco che è ovvio che il programmatore non capisce la concorrenza.

Non riassegnare una variabile utilizzata per la sincronizzazione.

0

Hai solo un problema se hai anche un blocco che assegna un nuovo valore al thread. In questo caso si ha una condizione di competizione in quanto i due blocchi non si bloccano sullo stesso oggetto, ma aggiorneranno lo stesso campo e sarà casuale quale blocco assegna il valore per ultimo.

1

L'espressione sincronizzata è dereferenziata alla voce, quindi qualsiasi utente successivo di questo blocco riceverà una NullPointerException. Puoi ovviare a ciò mettendo un check null prima del blocco sincronizzato, ma poi hai introdotto una race condition.

+0

'Valutato' in entrata. – EJP

+3

@EJP più che valutato: un'espressione che restituisce null non causa NullPointerException. –

Problemi correlati