執行緒與併發 synchronized

2021-10-07 16:21:57 字數 2855 閱讀 2778

多執行緒與高併發

當我們對乙個數字進行遞增操作時,如果兩個程式同時訪問,第乙個執行緒讀到count=0,並對其+1,在自己執行緒內部的記憶體裡還沒有寫回去的時候;第二個執行緒讀到的count也是0,並+1寫回去;但是程式明明對count進行了兩次+1操作,但結果還是1。

那麼我們對這個遞增過程加上一把鎖,當第乙個程式訪問的時候,這個資源是它獨佔的,不允許別的執行緒訪問計算,當第乙個執行緒計算完成並釋放鎖之後其它執行緒才能訪問,這樣就保證了執行緒安全。

public

class

thread_006).

start()

;new

thread((

)->).

start()

;}//去掉synchronized 可以看出來不加鎖的情況下我們預期的結果與實際結果是不符合的

static

/*synchronized*/

void

countadd()

catch

(interruptedexception e)

count++;}

system.out.

println

(thread.

currentthread()

.getname()

+"count = "

+ count);}

}當不在countadd方法上加鎖時的執行結果:

thread-

1count =

155thread-

0count =

155當在countadd方法上加鎖的執行結果:

thread-

0count =

100thread-

1count =

200

synchronized 加鎖的方式
public

class

thread_007

}//鎖定當前物件

public

voidm2(

)}//等同與m2鎖定當前物件

public

synchronized

voidm3(

)}

靜態方法加鎖
public

class

thread_008

public

static

voidm2(

)}}

synchronized保證原子性與執行緒間可見
public

class

thread_009

public

static

void

main

(string[

] args)}}

不加sychronized執行結果,我們可以看到多個執行緒輸出了同乙個值,最終結果不是我們預期的0..

....

thread 38223 count =

38230

thread 38166 count =

38229

thread 38226 count =

38229

thread 38169 count =

38229

thread 38284 count =

38230

thread 38168 count =

38228..

....

當我們加上sychronized時,會解決這個問題

thread 4 count =

3thread 5 count =

2thread 2 count =

1thread 1 count =

0

面試題:模擬銀行賬戶,對業務寫方法加鎖,對業務讀方法不加鎖,可以嗎?

答:不可以,容易產生髒讀現象;具體看**,解決方法就是把讀方法也加鎖

public

class

thread_010

catch

(interruptedexception e)

this

.balance = balance;

}public

synchronized

double

getbalance()

public

static

void

main

(string[

] args)

catch

(interruptedexception e)

system.out.

println

("當前賬戶餘額:"

+account.

getbalance()

);trycatch

(interruptedexception e)

system.out.

println

("當前賬戶餘額:"

+account.

getbalance()

);}}

不加鎖執行結果:

當前賬戶餘額:0.0

當前賬戶餘額:300.0

加鎖執行結果:

當前賬戶餘額:300.0

當前賬戶餘額:300.0

synchronized 鎖重入|異常鎖

synchronized 鎖公升級

面試題:cas(自旋鎖)一定比系統鎖的效率高嗎?

答:不一定,分具體情況:執行時間短(加鎖的**),執行緒數少,用自旋;執行時間長,執行緒數多,用系統鎖。

Java執行緒同步問題synchronized

android usb 讀寫以前都是一讀一寫,但有些機器會出問題。就採用讀寫非同步的方法。使用物件鎖,object自帶的,然後使用object的方法wait和notify notifyall 使用方法簡單,記錄下 public synchronized int lra setregister int...

Java學習之執行緒鎖 synchronized

同步 併發 多個執行緒訪問同乙份資源 確保資源安全 執行緒安全 synchronized 同步 1 同步塊 synchronized 引用型別 this 類.class 2 同步方法 public synchronized void test public class testsyn class t...

C 執行緒與併發

class program static void go static void gowithparam object msg bool done false private void button6 click object sender,routedeventargs e private voi...