2012-02-24 13 views
19

Continuo a leggere su come il blocco di polarizzazione, utilizzando il flag -XX: + UseBiasedLocking, può migliorare le prestazioni della sincronizzazione non finalizzata. Non sono riuscito a trovare un riferimento a ciò che fa e come migliora le prestazioni.Blocco parziale in java

Qualcuno può spiegarmi che cosa è esattamente o potrebbe essere indicarmi alcuni collegamenti/risorse che spiega ??

risposta

26

In sostanza, se gli oggetti sono bloccati da un solo filo, la VM può fare un ottimizzazione e " bias "che obietta a quel thread in modo tale che le successive operazioni atomiche sull'oggetto non comportino costi di sincronizzazione. Suppongo che questo sia in genere orientato verso un codice eccessivamente conservativo che esegue blocchi su oggetti senza mai esporli a un altro thread. L'overhead di sincronizzazione effettivo verrà eseguito solo dopo che un altro thread tenta di ottenere un blocco sull'oggetto.

È per impostazione predefinita in Java 6.

-XX: + UseBiasedLocking Consente di utilizzare una tecnica per migliorare le prestazioni di sincronizzazione uncontended. Un oggetto è "distorto" verso il thread che acquisisce il suo monitor tramite un bytecode di monitoraggio o una chiamata di metodo sincronizzata; le successive operazioni relative al monitor eseguite da quel thread sono relativamente più veloci su macchine multiprocessore. Alcune applicazioni con quantità significative di sincronizzazione incontrollata possono raggiungere significativi aumenti di velocità con questo flag abilitato; alcune applicazioni con determinati modelli di blocco potrebbero vedere rallentamenti, sebbene siano stati fatti tentativi per minimizzare l'impatto negativo.

5

Non risponde alle tue domande?

http://www.oracle.com/technetwork/java/tuning-139912.html#section4.2.5

Consente una tecnica per migliorare le prestazioni di sincronizzazione uncontended . Un oggetto è "distorto" verso il thread che, per primo, acquisisce il proprio monitor tramite un bytecode monitorenter o un richiamo del metodo sincronizzato; successive operazioni relative al monitor eseguite da che thread sono relativamente più veloci su macchine multiprocessore. Alcune applicazioni con quantità significative di sincronizzazione non aggiornata possono raggiungere aumenti significativi con questo flag attivato; alcune applicazioni con determinati tipi di blocco potrebbero vedere rallentamenti , sebbene siano stati effettuati tentativi per minimizzare l'impatto negativo .

Anche se penso che troverete è per impostazione predefinita in 1.6. Utilizzare l'opzione di diagnostica PrintFlagsFinal per vedere quali sono i flag effettivi. Assicurati di specificare -server se si sta indagando per un'applicazione server perché le bandiere possono differire:

http://www.jroller.com/ethdsy/entry/print_all_jvm_flags

3

Mi sono chiesto anche io le serrature parziali.

Tuttavia sembra che le serrature parziali di java siano più lente sui processori nehalem di Intel rispetto alle serrature normali, e presumibilmente sulle due generazioni di processori da nehalem.Vedere http://mechanical-sympathy.blogspot.com/2011/11/java-lock-implementations.html e qui http://www.azulsystems.com/blog/cliff/2011-11-16-a-short-conversation-on-biased-locking

anche maggiori informazioni qui https://blogs.oracle.com/dave/entry/biased_locking_in_hotspot

ho sperato che ci sia un modo relativamente poco costoso per revocare un blocco di parte su Intel, ma sto cominciando a credere che non è possibile. Gli articoli che ho visto su come è fatto si basano su: 1) utilizzando il sistema operativo per interrompere il thread 2) inviare un segnale, ovvero eseguire il codice nell'altro thread 3) con punti sicuri che sono garantiti per funzionare correttamente spesso nell'altro thread e in attesa che uno venga eseguito (che è ciò che fa java). 4) avere punti sicuri simili che sono una chiamata a un ritorno - e l'altro thread MODIFICA IL CODICE in un punto di interruzione ...