Quando due thread cercano di acquisire il blocco dello stesso oggetto, quali sono le cose che sono considerate da decidere su quale thread deve essere consegnato il lock.Che cosa determina quale dei due thread concorrenti acquisisce un blocco?
risposta
Secondo il Java documentation for notify():
sveglia un singolo processo in attesa sul monitor di questo oggetto. Se qualsiasi thread è in attesa su questo oggetto, uno di questi viene scelto come risvegliato. La scelta è arbitraria e si verifica a discrezione dell'implementazione . Un thread attende sul monitor di un oggetto chiamando uno dei metodi di attesa.
Quindi, se si utilizza synchronized(obj){}
che, fondamentalmente, non hanno alcun controllo su quale thread otterrà il blocco su obj
, e non si può fare alcuna ipotesi. Dipende dallo schedulatore.
Se si desidera l'equità (ovvero il thread successivo che ottiene il blocco è il primo della coda), dare un'occhiata a ReentrantLock: ha un flag booleano per specificare che si desidera applicare equità.
Secondo Java Oracle Docs:
Il costruttore per questa classe accetta un parametro di equità opzionale. Se impostato true, in conflitto, i blocchi preferiscono la concessione dell'accesso al thread con l'attesa più lunga. Altrimenti questo blocco non garantisce alcun ordine di accesso particolare.
Se si concede l'equità, viene utilizzato FIFO (First-in-First-out), altrimenti sembra casuale (dalle mie osservazioni).
si presume che utilizzi ReentrantLock ... ha solo detto "fili in competizione per un blocco sullo stesso oggetto", che potrebbe essere qualsiasi Oggetto IMHO –
- 1. Quale thread otterrà il blocco?
- 2. Che cosa determina l'ordinamento dei file in un QFileDialog?
- 3. Che cos'è il "Hello World" dei programmi concorrenti?
- 4. Come eseguire thread concorrenti in perl?
- 5. Che cosa determina quale versione di Typescript viene utilizzata durante un processo di msbuild?
- 6. Blocco mutex: cosa significa "blocco"?
- 7. Che cosa determina l'offset del consumatore Kafka?
- 8. Chiama recv() sulla stessa presa di blocco da due thread
- 9. Che cosa determina se viene visitato un collegamento?
- 10. C++ Che cosa determina quale versione di C++ può essere eseguita su un'architettura specifica (come Arduino)
- 11. Che cosa significa POSIX che un thread è "sospeso"?
- 12. In un array con numeri interi un valore è nell'array due volte. Come si determina quale?
- 13. blocco thread wxPython
- 14. In che modo UITableViewRowAnimationAutomatic determina quale animazione usare?
- 15. Che cosa determina l'ordine di esecuzione dei metodi nelle catene jQuery?
- 16. C# regex acquisisce
- 17. Blocco thread Java
- 18. Cosa rende imprevedibile l'ordine di esecuzione dei thread?
- 19. In che modo Assert.AreEqual determina l'uguaglianza tra due IEnumerables generici?
- 20. Cosa sono i thread (cos'è un thread)?
- 21. Determina quale elemento ha inviato un modulo dall'interno di onsubmit
- 22. Task.ContinueWith acquisisce il contesto del thread chiamante per la continuazione?
- 23. Che cosa è più consigliabile creare un thread estendendo una classe Thread o implementando Runnable?
- 24. Regex acquisisce ogni occorrenza di una parola entro due delimitatori
- 25. Come consentire a due processi concorrenti di comunicare?
- 26. C# che esce da un blocco using() con un thread ancora in esecuzione sull'oggetto ambito
- 27. Che cosa esattamente visualizza: blocco; fare ad un elemento?
- 28. In che modo Android acquisisce screenshot?
- 29. Meccanismo di callback Nodejs - quale thread gestisce il callback?
- 30. Android acquisisce attività precedente
Grazie. Inoltre, sembra che il blocco sincronizzato (obj) invochi anche wait(), potresti delineare la catena di azioni che vengono eseguite prima, durante e dopo il blocco sincronizzato o i metodi – itsraja
Cosa intendi? L'algoritmo utilizzato per garantire l'esclusione reciproca su un pezzo di codice? O l'algoritmo di programmazione? Per il primo, solo concettualmente, si consiglia di dare un'occhiata all'algoritmo di Peterson: https://en.wikipedia.org/wiki/Peterson's_algorithm. Per quest'ultimo, è discusso qui: http://stackoverflow.com/questions/2816011/what-is-the-jvm-scheduling-algorithm –
Grazie. Intendevo l'esclusione reciproca in termini di metodi di Java. come wait(), notify() ... Sarò felice di vedere una sequenza di queste chiamate di funzione simulate per 2 thread che provano per 1 oggetto. Ehi, questo è analogo a 2 (o più) ragazzi che propongono 1 ragazza. Lo chiamano matrimonio;) – itsraja