關於Synchronized關鍵字的測試
一、含義
Synchronized作為java的關鍵字,可以在後面帶上修飾的物件,加上程式碼塊,也可以修飾方法。
它的含義可以理解為:執行程式碼塊的語句之前,必須獲得修飾的物件的鎖。
具體可以分為以下幾種情況:
1.修飾物件是一個類物件,作用範圍是整個程式碼塊,鎖作用於這個類的所有物件,所有的物件共用一個鎖;
2.修飾物件是一個具體物件例項,作用範圍是整個程式碼塊,執行程式碼塊必須先獲得例項的鎖;
3.修飾物件是一個方法,作用範圍是整個方法,必須獲得呼叫該方法的物件的鎖才可以執行;
4.修飾是一個靜態方法,作用返回是整個方法,鎖作用於這個類的所有物件,所有的物件共用一個鎖;
二、作用
多執行緒程式設計中,如果沒有引入鎖的機制,那資料就會存在髒讀,資料會錯亂。以一個自增的例子來說:
(1)如果沒有使用同步鎖,1000個執行緒併發執行對count的自增操作:

執行結果為:
普通遞增結果:992耗時:68
得到的結果不是我們要的1000
(2)引入同步鎖來修飾自增的方法:


得到的結果:
通過同步鎖遞增結果:1000耗時:1305
可以發現引入鎖之後,我們得到了預期的結果,但同時因為鎖競爭的關係,耗時也翻了很多倍。
(3)根據前面的介紹,我們也可以將鎖設定在物件中


得到的結果:
通過synchronized修飾物件遞增結果:1000耗時:1297
三、拓展
從上面的測試情況中,發現synchronized關鍵字雖然可以解決併發讀寫的問題,但是同時也因此導致執行緒間鎖競爭,鎖等待的問題,因此效能也急劇下降;
但java也給我們提供了Atomic類,JDK1.5開始提供了 java .util.concurrent. atomic 包,方便我們無需使用鎖就可以進行原子級的操作。


得到的結果:
使用Atomic結果:1000耗時:39