volatile具有兩個特性宦搬,一個是保證此變量對所有線程的可見性语泽,另一個是禁止指令重排序畏陕。volatile變量的運算在并發(fā)情況下也是不安全的岛琼。如下
避免在以上場景使用
最后輸出結果都不一樣底循,都是一個小于200000的數(shù)字巢株。原因在于java里面的運算并非原子操作槐瑞。所以在以下兩種情況下我們?nèi)匀恍枰尤海╯ynchronized或concurrent中的原子類)來保證原子性1.運算結果并不依賴變量的當前值,或者能夠確保只有一個單一線程修改變量的值2.變量不需要與其他的狀態(tài)變量共同參與不變約束阁苞。
正確使用方式
synchronized是保證一個變量在同一時刻只允許一條線程對其進行l(wèi)ock操作來保證同步的困檩。它提供了更高層次的字節(jié)碼指令monitorenter和monitorexit來隱式地加鎖,因此代碼塊之間的操作也具備原子性那槽。