Molte persone hanno fatto domande simili come questa, ma nessuna delle loro risposte mi ha soddisfatto. Le uniche due Riordinamento delle regole che io sono molto sicuro sono i segue:Quali sono i metodi di riordino validi per Java sincronizzati?
- Operations all'interno del blocco sincronizzato (o semplicemente chiamare sezione critica) sono ammessi da riordinare, a patto che conferma alla semantica come se seriale.
- Le operazioni (incluse le letture e le scritture ) sono non consentite da spostare (riordinate) fuori dalla sezione critica.
Tuttavia, per le operazioni precedenti o successive al blocco sincronizzato, possono essere spostate nella sezione critica? Per questo problema, ho trovato un po 'contrario. Ad esempio, il cookbook detto che il compilatore inserirà alcune barriere dopo la MonitorEnter e prima della MonitorExit:
MonitorEnter
(any other needed instructions go here)
[LoadLoad] <===MB1:Inserted memory barrier
[LoadStore] <===MB2:Inserted memory barrier
(Begin of critical section)
....
(end of critical section)
[LoadStore] <===MB3:Inserted memory barrier
[StoreStore] <===MB4:Inserted memory barrier
(any other needed instructions go here)
MonitorExit
Secondo essere superiore posizionamento fatta dal compilatore e indicato di seguito pseudo codice:
Load a;
Load b;
Store 1;
Store 2;
MonitorEnter
(any other needed instructions go here)
[LoadLoad] <===MB1
[LoadStore] <===MB2
(Begin of critical section)
....
(end of critical section)
[LoadStore] <===MB3
[StoreStore] <===MB4
(any other needed instructions go here)
MonitorExit
Store 3;
Store 4;
Load c;
Load d;
Secondo il ricettario e le regole di prevenzione del riordino imposte da tali XY (X è Load o Store, Y is Load o Store), mi sembra che il riordino valido/non valido sia il seguente:
Comprensione 1: Qualsiasi sto res (Store 3 e Store 4 qui) dopo che MonitorExit può NON essere spostato verso l'alto prima di MB3 e MB4, a causa dell'esistenza di un LoadStore (MB3) seguito da un Store Store (MB4). Vale a dire i negozi dopo che MonitorExit non può essere spostato nella sezione critica. Tuttavia, è possibile essere spostato verso l'alto dopo MB4, vale a dire l'area della staffa.
Capire 2: Eventuali carichi (caricare una e carico b qui) prima della MonitorEnter può NON essere spostato verso il basso dopo MB2 e MB1, a causa dell'esistenza di un LoadLoad (MB1) seguito da un LoadLoad (MB2). Vale a dire carichi prima che MonitorEnter non possa essere spostato nella critica. Tuttavia, è possibile spostare dopo MB2, ovvero l'area della staffa.
Understanding 3: Qualsiasi carico (carico C e carico d qui) dopo il MonitorExit può essere spostati prima della MonitorExit, compresa la sezione critica e la zona del movimento, ma non può superare il MonitorEnter.
Capire 4: Tutti i negozi (negozio di 1 e 2 Conservare qui) prima della MonitorEnter possono essere spostati verso il basso dopo la MonitorEnter, compresa la sezione critica e la zona del movimento, ma non può superare il MonitorExit.
Tuttavia, tutta la comprensione o reclamo sopra vedono in contrasto con quello che ha detto Jeremy Manson nel suo blog, dove ha sostenuto che danno sottostante Codice:
x = 1;//Store
synchronized(o) {
z = z + 1;
}
y = 1//Store
Riordino che producono sottostante Codice è ammessi:
synchronized(o){
y = 1;//I added this comment:Store moved inside the critical section
z = z + 1;
x = 1;//I added this comment:Store moved inside the critical section
}
Secondo Understanding 1, "y = 1" non può essere spostato all'interno della sezione critica, Così ho solo era confusa, che è quella corretta e complet e?
http://jeremymanson.blogspot.fi/2007/05/roach-motels-and-java-memory-model.html – ale64bit