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?

È stato utile?

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.

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