執行緒鎖 -賣票機制
public class TicketService {
ArrayList<String> list = new ArrayList<>() ;
//private Vector list = new Vector (); vector中方法 remove 和size 是有鎖
public TicketService(){
list.add("01車0A號");
list.add("01車0B號");
list.add("01車0C號");
list.add("01車0D號");
list.add("01車0E號");
list.add("01車0F號");
list.add("02車0A號");
list.add("02車0B號");
list.add("02車0C號");
list.add("02車0D號");
list.add("02車0E號");
list.add("02車0F號");
}
public void sale () {
//this or all都可以
//public void synchronized sale () {
synchronized(list) {
if(list.size()>0) {
String number = list.remove(0);
System.out.println(number);
}else {
System.out.println("已經賣光了");
}
}
}
public boolean hasTicket() {
return list.size()>0;
}
}
/***
* 賣票:兩個視窗同時賣票
* 出現了兩個視窗賣出 ,票號相同的票
*原因:兩個執行緒操作了同一個資源 共享資料list 這就會有執行緒問題
*Java 中提供了一種方式解決執行緒安全問題
* 同步程式碼塊
*sychronized(同步監視器物件){
* 需要同步程式碼
*}
*同步監視器物件的要求
*1)同步監視器物件的型別 可以是任意的引用資料的型別
*2)使用共享資料的這個多執行緒要用了同一個監視器物件
*同步方法:
*sychronized() throw
*
*同步監視器物件放在方法上:
*非靜態方法:this
*靜態方法:當前類class
*也必須保證多個執行緒用同一個監視器物件 this也要是同一個
*依據:哪些程式碼執行過程中,不允許其它執行緒插入進來
*/
public class TestSale {
public static void main(String[] args) {
Window window1 = new Window("視窗一") ;
Window window2 = new Window("視窗二") ;
window1.start();
window2.start();
}
}
class Window extends Thread {
static TicketService ts = new TicketService() ;
//TicketService ts = new TicketService() ; 錯誤 因為tickerservice 是需要一個物件
public Window (String name) {
super(name);
}
// public synchronized void run 錯誤的原因是因為非靜態方法是鎖定的this 但是這個this 是windows1 windows2 是不同的物件
public void run () {
while(ts.hasTicket()) {
ts.sale();
}
}
}
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/2018112215124247.png?x-oss-process=image/watermark, type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1BZb3VMaW5nMTIzNDU2Nzg5,size_16,color_FFFFFF,t_70)
相關文章
- 多執行緒—賣票執行緒
- JAVA多執行緒與鎖機制Java執行緒
- Java多執行緒4:synchronized鎖機制Java執行緒synchronized
- 多執行緒賣火車票簡單例子執行緒單例
- 利用多執行緒寫一個賣票程式執行緒
- JAVA學習筆記之 多執行緒賣票Java筆記執行緒
- 執行緒同步機制執行緒
- Java多執行緒之併發安全經典案例-賣票Java執行緒
- JavaScript執行緒機制與事件機制JavaScript執行緒事件
- 執行緒Thread練習題1買票,使用多執行緒的方式模擬四個視窗賣100張票執行緒thread
- 執行緒同步及執行緒鎖執行緒
- python多執行緒、鎖、event事件機制的簡單使用Python執行緒事件
- java synchronize - 執行緒同步機制Java執行緒
- quartz的執行緒池機制quartz執行緒
- Java多執行緒(2)執行緒鎖Java執行緒
- 多執行緒_鎖執行緒
- 執行緒鎖(四)執行緒
- 分析.Net裡執行緒同步機制執行緒
- 多執行緒之等待通知機制執行緒
- 執行緒間的協作機制執行緒
- 執行緒同步機制-包裝類執行緒
- FlutterEngine執行緒管理與DartIsolate機制Flutter執行緒Dart
- Python並行程式設計(二):多執行緒鎖機制利用Lock與RLock實現執行緒同步Python並行行程程式設計執行緒
- Java執行緒:執行緒的同步與鎖Java執行緒
- Java語言多執行緒實現一個火車站賣票系統Java執行緒
- 執行緒和鎖,鎖升級執行緒
- iOS多執行緒安全-13種執行緒鎖?iOS執行緒
- 多執行緒(2)-執行緒同步互斥鎖Mutex執行緒Mutex
- 深入理解 OpenMP 執行緒同步機制執行緒
- RxJava(RxAndroid)執行緒切換機制RxJavaAndroid執行緒
- java多執行緒系列之future機制Java執行緒
- 執行緒間通訊_等待/通知機制執行緒
- Java多執行緒17:中斷機制Java執行緒
- innodb master執行緒的工作機制AST執行緒
- 【Swift】iOS 執行緒鎖SwiftiOS執行緒
- 執行緒的互斥鎖執行緒
- linux多執行緒-----同步機制(互斥量、讀寫鎖、條件變數)Linux執行緒變數
- 一起分析執行緒的狀態及執行緒通訊機制執行緒