Domanda

Java 6 domanda API. Ha chiamando LockSupport.unpark(thread) ha un accade-prima rapporto con il ritorno dalla LockSupport.park nel thread appena parcheggiati? Ho il forte sospetto che la risposta è sì, ma il Javadoc non sembra parlare in modo esplicito.

È stato utile?

Soluzione

Ho guardato se il codice JDK e sembra che i metodi LockSupport sono normalmente chiamati al di fuori di blocchi di sincronizzazione. Quindi, la tua ipotesi sembra essere corretta.

Altri suggerimenti

Ho appena trovato questa domanda, perché mi chiedevo la stessa cosa. Secondo questo articolo da Oracle ricercatore David Dice , la risposta sembra essere non . Ecco la parte rilevante di questo articolo:

  

Se un thread è bloccato in park() stiamo garantito che un successivo   unpark() renderà pronto. Un perfettamente legale, ma di bassa qualità   attuazione park() e unpark() sarebbe metodi vuoti, in cui   il programma degenera in semplice filatura. Un fatto che è il   cartina di tornasole per il corretto utilizzo park()-unpark().

vuoti park() e unpark() metodi non danno voi qualsiasi accade-prima di relazione garanzie, quindi per il vostro programma per essere portabile 100%, non si dovrebbe fare affidamento su di loro.

Poi di nuovo, il Javadoc di LockSupport dice:

  

Questi metodi sono progettati per essere utilizzati come strumenti per la creazione di   utilità di sincronizzazione di livello superiore, e non sono di per sé   utile per molte applicazioni controllo della concorrenza. Il metodo è park   progettata per l'uso in costruzioni di forma:

     

while (!canProceed()) { ... LockSupport.park(this); }

Dal momento che si controlla in modo esplicito alcune condizioni in ogni caso, che sia coinvolgerà volatile o variabili correttamente sincronizzati, le garanzie deboli della park() non dovrebbero essere effettivamente problema, giusto?

Se non è documentato come tale allora non si può fare affidamento su di essa la creazione di un rapporto avviene prima.

In particolare LockSupport.java in Hotspot codice chiama semplicemente Unsafe.park e .unpark!

accade-prima rapporto saranno generalmente provengono da una coppia di scrittura-lettura su una bandiera di stato volatile o qualcosa di simile.

Ricordate, se non è documentato come la creazione di un accade-prima rapporto allora si deve trattarlo come se non anche se si può dimostrare che lo fa sul vostro sistema specifico. sistemi futuri e implementazioni non può. Si lasciarono che la libertà per una buona ragione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top