java併發和高併發之線程安全性—原子性 2—synchronized

一、原子性——鎖

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性能好;但只能同步一個值。 最常用於做標誌位。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章