Domanda

Vorrei chiedere se Java utilizzerà più risorse della CPU quando i thread sono bloccati, cioè in attesa di bloccare un monitor che è attualmente bloccato da un altro thread.

Ora sto guardando un dump thread in base al quale alcuni thread sono bloccati in quanto aspettano di bloccare un monitor e non sono sicuro se questo è ciò che potrebbe essere responsabile per l'elevato utilizzo della CPU.

Grazie!

Modifica (6 maggio 2011) ho dimenticato di menzionare se questo comportamento è rilevante per Java SE 1.4.2.

È stato utile?

Soluzione

I thread consumano risorse come la memoria. Un filo blocco/sbloccante comporta un costo una volta fuori. Se un blocco del filo/sblocca decine di migliaia di volte al secondo, questo può sprecare quantità significative di CPU.

Tuttavia, una volta che un thread è bloccato, non importa per quanto tempo è bloccato, non vi è alcun costo continuo.

Altri suggerimenti

La risposta non è così semplice. Potrebbero esserci casi in cui i thread che vanno nello stato bloccato possono finire per causare l'utilizzo della CPU.

La maggior parte dei JVM impiega algoritmi di bloccaggio a più livelli. Gli algoritmi spesso coinvolgono come spinlock, specialmente per le serrature tenute a breve durata. Quando un thread cerca di acquisire un monitor e lo scopre non può, il JVM può effettivamente metterlo in un ciclo e far tentare il thread di acquisire il monitor, piuttosto che il contesto di cambiarlo immediatamente. Se il thread non riesce ad acquisire il blocco dopo un determinato numero di tentativi o durata (a seconda dell'implementazione JVM specifica), la JVM passa a una modalità "blocco grasso" o "blocco gonfiato" in cui il contesto cambia il thread.

È con il comportamento di spinlock in cui è possibile sostenere i costi della CPU. Se hai un codice che contiene blocco per una durata molto breve e la tesi è alta, potresti vedere un aumento apprezzabile nell'utilizzo della CPU. Per alcune discussioni su varie tecniche che i JVM usano per ridurre i costi sulla contesa, vedi http://www.ibm.com/developerworks/java/library/j-jtp10185/index.html.

No, thread che sono bloccati su un monitor non Prendi ulteriore tempo della CPU.

Il thread sospeso o bloccato non consuma il tempo della CPU.

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