內建鎖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 ...