一、原子性——鎖
1、原子性就是提供了互斥訪問,同一時刻只能有一個線程對它進行訪問或者說操作.java中,除了jdk中的atomic包之外,還有鎖。jjdk提供的鎖主要有兩種:
》synchronized 關鍵字: 依賴jvm. 在作用對象的作用範圍內,可以保證在同一時刻只能有一個線程訪問。注意synchronized的作用對象的作用範圍內。
》Lock接口:依賴特殊的CPU指令,代碼實現,比較有代表的實現類爲ReentrantLock 類
2、原子性-synchronized
java的關鍵字,是一個同步鎖,修飾的對象主要有四種:
》修飾代碼塊:大括號括起來的代碼,作用於調用的對象,被修飾的代碼塊稱爲同步語句塊;
》修飾方法;整個方法,作用於調用的對象,被修飾的方法稱爲同步方法;
》修飾靜態方法;整個靜態方法,作用於所有對象。注意這裏的作用對象範圍;
》修飾類:括號括起來的部分,作用於所有對象,注意這裏的作用對象範圍;
代碼示例如下:
1)測試一;
註釋:如上,使用了線程池,同一個方法調用了兩次,從而模擬多線程併發,如果不使用線程池,那麼調用兩該方法,
這兩個方法本身就是同步關係,無法實現測試效果。而線程池,第一個方法不執行完,第二個方法就可能被執行。
運行下結果:
然後是兩次,每個連續的test1—0~9
2)測試二:
將上方的main() 中調用的test1()方法,都換成test2() 測試下,
效果同測試一。
3)測試三:
將上方的main方法中,再創建一個對象example2,如圖:
注:test1() 方法添加了一個變量,用於方便查看測試效果,判斷是哪個對象在運行:
運行結果
如上可以看出,兩個對象執行時,每個對象自己按照從0到9的順序執行,兩個對象是互相交替,但兩個對象互不影響,
4)測試4:
將上方的test2仿照test3 處理,然後運行,效果如下:
運行效果如下:
總結:不同對象之間互不影響;
如果一個方法中,整體都是同步代碼塊時,和同步方法效果是一樣的。
注意,如果父類的方法用synchronized修飾時,子類是無法繼承其synchronized的性質的,因爲synchronized 不屬於方法聲明的一部分。如果子類也需要使用synchronized的特性,需要自身顯示地添加該關鍵字。
5)測試5:如下開始模擬測試synchronized修飾靜態方法:
6)測試6:synchronized修飾一個類
運行結果:
7)
8)總結:
原子性對比結果:
》synchronized :不可中斷鎖,適合競爭不激烈(競爭激烈時性能下降明顯),可讀性好;
》Lock :可中斷鎖(使用unlock可解鎖),多樣化同步,競爭激烈時能維持常態;
》Atomic :競爭激烈時能維持常態,比Lock性能好;但只能同步一個值。 最常用於做標誌位。