java的同步說白了就是要保證運行程序的順序一致性java
順序一致性:順序一致性模型是被計算機科學家理想化的理論參考模型,爲程序員提供了極強的內存可見性保證,兩大特性:程序員
可是JMM自己沒有對多線程下的執行順序作一致性的保證,在順序一致性模型中,全部操做徹底按照程序順序串行執行,在JMM中,臨界區的代碼能夠從新排序,單會在臨界區的時間點作一些特殊處理,保證雖然在臨界區內作了重排序,可是因爲監視器的互斥特性,B沒法觀察到A的重排序,既提升了執行效率,有沒有改變執行的結果。多線程
可是若是沒有執行同步操做,JMM不保證執行結果跟順序一致性模型的結果同樣,由於這樣的話,就須要禁用大量的處理器和編譯器的優化,對執行的性能會產生很大的影響。未同步的程序在順序一致性模型中,總體是無序的。結果沒法預知,保證未同步程序的兩個模型的執行結果沒什麼意義。性能
如何理解上邊這段話呢,個人見解是這樣,順序一致性模型的是理想的模型,可是現實很骨感,若是要作大這種模型,就對於處理器的優化和編譯器的優化形成很大的影響,可是若是單單是爲了同步這個事兒,把這些優化都給取消掉了的話,得不償失。這也能夠理解成爲何java語言再設計的時候幹嗎不直接把這些須要考慮的同步問題都給屏蔽了呢,直接讓語言來保證這個,就是由於這涉及到大量的處理器的的指令優化的損失。優化
java的同步機制呢,就是設法,在專門對於臨界操做的時候呢作一些處理,保證他看着跟順序一致性水樣的可是還不影響大執行的優化,編譯器的優化。線程