多執行緒安全之內置鎖(sychronized)

2021-10-23 14:59:56 字數 2681 閱讀 8668

內建鎖sychronized:可以保證執行緒的原子性,當執行緒進入方法的時候會自動獲取鎖,其他執行緒只能進入等待狀態

/**

* 採用內建鎖(sychronized)的方式,解決執行緒安全問題

* 通過模擬搶購車票的案例來演示

*/ class ticksale implements runnable catch (interruptedexception e)

sale()

;}}//賣票嘍

public void sale()

}}public class threaddemo

}

以上**是在沒有加鎖的情況下執行結果如下:

...

視窗一,

**95

張票視窗一,**

97張票

視窗二,

**97

張票視窗二,**

99張票

視窗一,

**99張票.

..

會出現同一張票被重複**的現象,顯然這不是咱們想要的結果,肯定會耽誤乘客時間

/**

* 採用內建鎖(sychronized)的方式,解決執行緒安全問題

* 通過模擬搶購車票的案例來演示

*/ class ticksale implements runnable catch (interruptedexception e)

sale()

;}}//賣票嘍 鎖在這呢

public sychronized void sale()

}}public class threaddemo

}

在**方法上加上內建鎖(sychronized)

...

視窗二,

**95

張票視窗一,**

96張票

視窗二,

**97

張票視窗一,**

98張票

視窗一,

**99

張票視窗二,**

100張票

顯然這樣就不會導致重複**的情況

首先咱們得先說一下同步**塊所需條件:那就是所有的執行緒共享乙個全域性物件obj

結構:sychronized(obj)

/**

* 採用內建鎖(sychronized)的方式,解決執行緒安全問題

* 通過模擬搶購車票的案例來演示

*/ class ticksale implements runnable catch (interruptedexception e)

sale()

;}}//賣票嘍

public void sale()

}}}public class threaddemo

}

結果來了,很符合現實

...

視窗一,

**95

張票視窗二,**

96張票

視窗二,

**97

張票視窗一,**

98張票

視窗一,

**99

張票視窗二,**

100張票

顯然沒有出現重複搶票的情況 **

/**

* 採用內建鎖(sychronized)的方式,解決執行緒安全問題

* 通過模擬搶購車票的案例來演示

*/ class ticksale implements runnable catch (interruptedexception e)

sale()

;}}//賣票嘍

public void sale()

}}}public class threaddemo

}

大家可能已經猜到結果了,沒錯

...

視窗一,

**98

張票視窗二,**

98張票

視窗二,

**99

張票視窗一,**

99張票

視窗一,

**100

張票視窗二,**

100張票

又出現重複搶同一張票的情況了,怎麼回事呢

怎麼辦呢?那咱們就讓他們共享count和obj不就行了? 那麼問題來了,如何讓全域性變數實現共享?

靜態全域性變數:存放於方法區,只有乙份

private static int count = 100; //總票數

//全域性共享物件

private static object obj = new object();

結果如下:

...

視窗一,

**95

張票視窗二,**

96張票

視窗一,

**97

張票視窗二,**

98張票

視窗二,

**99

張票視窗一,**

100張票

嗯,多執行緒安全之內置鎖sychronized,就完事了,如有問題,請各位多多指教。

JAVA多執行緒顯示鎖和內建鎖

一 內建鎖 synchronized 1 內建鎖的獲得鎖和釋放鎖是隱式的,進入synchrnozied修飾的 要獲得鎖,走出相應的 要釋放鎖。2 與synchronized配套使用的執行緒通訊方式 wait notify notifyall wait會立刻釋放當前鎖,並進入等待狀態,等待的到相應的n...

多執行緒安全無鎖訊息佇列

技術介紹 cas 原子操作 是有cpu提供的原子操作。mydeque 入隊操作 void enqueue t value 通過援助操作,更新tail cas tail,tail,tail next 出對操作 t dequeue t temvalue q value recycle q 空間 retu...

多執行緒 使用鎖編寫執行緒安全的程式

對上乙個例子的改進。1 競爭資源 public class student2 設定物件和獲取物件的執行緒 為了展示效果,我們使用了迴圈。public class setthread implements runnable override public void run else x public ...