Blocco di blocchi contro serrature non bloccanti
-
13-11-2019 - |
Domanda
Sto pensando qui: se hai 2 thread che eseguono le operazioni veloci che devono essere sincronizzate, non è un approccio non bloccante più veloce / meglio di un approccio di blocco / contesto?
Dal non-blocco intendo qualcosa come:
while (true) { se (checkandgethelock ()) pausa; }
L'unica cosa che posso pensare è la fame (con la CPU Burn out) se hai troppi fili che looping attorno alla serratura.
Come posso bilanciare un approccio rispetto all'altro?
Soluzione
Ecco cosa concorrenza Java in pratica dice sul soggetto:
.Il JVM può implementare il blocco tramite l'attesa di spin (ripetutamente cercando di acquisire la serratura fino a quando non riesce) o nel disporre di Filo bloccato attraverso il sistema operativo. Che è più efficiente dipende dalla relazione tra il piano di contesto in alto e il tempo fino a quando la serratura diventa disponibile; L'attesa di spin è preferibile per Le attese e le sospensioni brevi sono preferibili per lunghe attese. Alcuni jvms. Scegli tra i due in modo adattabile in base ai dati di profilazione dell'attesa passata volte, ma la maggior parte sospende i fili in attesa di una serratura.
E anche (che è, IMO, il punto più importante):
.Non preoccuparti eccessivamente del costo della sincronizzazione incontaminata. Il meccanismo di base è già abbastanza veloce, e JVMS può eseguire Ottimizzazioni aggiuntive che riducono o eliminano ulteriormente il costo. Invece, gli sforzi di ottimizzazione della messa a fuoco sulle aree in cui la distensione della serratura effettivamente si verifica.
Altri suggerimenti
Beh, l'unico modo per essere sicuro è testarlo.Quando si tratta di multithreading e prestazioni, semplicemente non puoi assumere.