當我們在使用jvm鎖的時候,一方面是為了減少線程的競爭,另外還有一方面就是保證共享數據的及時可見性。為了保證線程共享變量的可見性,會使用到內存柵欄,jvm設置內存柵欄,并將共享數據及時刷新到主存中保證其他線程可以獲得最新變量數據。在使用內存柵欄時,程序會被禁止重排序。如下:
foo++;
bar++;
對bar變量加鎖:
foo++;
synchronized(obj)
{bar++;
}
?在加鎖前,編譯器可以同時加載兩個變量的值,同時對他們的值進行+1后保存數據。在加鎖后就必須先執行foo++,在處理bar++,編譯無法在使用重排序的方式對程序進行優化。