2010-10-17 16 views
5

supponiamo di avere una macchina multiprocessore e un'applicazione multi-thread. Se due thread hanno accesso a un metodo sincronizzato e sono stati eseguiti nello stesso momento in cui thread otterrà il blocco? o cosa succederà?Quale thread otterrà il blocco?

Grazie

+0

Immagino che VM debba lanciare una moneta. –

+0

Un po 'in relazione a http://stackoverflow.com/questions/3940164/java-waiting-on-synchronized-block-who-goes-first – Thilo

+0

Ciò significa che la VM può morire di fame un thread se entrambi i thread cercano di acquisire il bloccare in un ciclo? –

risposta

2

Il punto è che non esiste "allo stesso tempo". Uno dei due otterrà il lucchetto, ma non hai modo di sapere quale.

Non esiste una cosa "allo stesso tempo" perché, in senso letterale, un blocco è qualcosa che sceglie e esegue i thread uno alla volta esclusivamente.

Questo è naturalmente realizzato in un sistema monoprocessore puro in grado di eseguire una istruzione alla volta. Sui sistemi multiprocessore di solito c'è un dispositivo hardware che "blocca" i processori per impedirne l'esecuzione nello stesso momento.

+1

Perché non "allo stesso tempo"? –

+0

Perché non dovrebbe essere qualcosa "allo stesso tempo". Stiamo parlando di un hardware multiprocessore ... – aioobe

+0

Ma il codice che gestisce il blocco deve essere serializzato in qualche modo. – Thilo

9

Il comportamento sarà non-deterministico (cioè o filo può ottenere il blocco), e può variare da esecuzione a esecuzione. Questo perché dipende dall'implementazione JVM specifica e dalla particolare pianificazione dei thread.

Secondo questo articolo alla specifica JVM non pone restrizioni alla correttezza:

Equità
Il modello di memoria di Java non specifica alcun requisito equità per le discussioni o preemptive multi-threading. Un thread può rifiutarsi di consegnare la CPU a un altro thread e lanciare il sistema in deadlock. Le regole di equità per altri thread sono definite dalle singole implementazioni JVM.

vale a dire, a meno che non si sincronizza con attenzione il vostro programma, un thread può teoricamente ottenere fame dallo scheduler.

+2

Inoltre, non penso che ci saranno "allo stesso tempo" a quel livello. Un thread otterrà il blocco, solo in virtù di arrivare prima. Non c'è bisogno di un lancio di monete. – Thilo

+0

Sì, sono d'accordo ... – aioobe

Problemi correlati