1. 程式人生 > 實用技巧 >併發性異常與鎖

併發性異常與鎖

當多個執行緒,操作一個內容的時候,由於使用的是Runnable或Thread,
就需要定義全域性公用的資料物件。

如果多個執行緒同時操作一個數據結果,
容易產生:併發性異常。

併發性異常:
資料超出了正常的範圍。

解決這個問題,就需要 鎖:synchronized

模擬一個售票系統,同時開啟多個執行緒並加鎖

package com.xzm.執行緒;

public class _04_併發性異常與鎖 {

    //主函式:售票大廳
    public static void main(String[] args) {
        
        //建立執行緒:售票視窗
        Thread t1 = new
store("01視窗:"); Thread t2 = new store("02視窗:"); Thread t3 = new store("03視窗:"); Thread t4 = new store("04視窗:"); Thread t5 = new store("05視窗:"); //開窗售票 t1.start(); t2.start(); t3.start(); t4.start(); t5.start(); } }
//================================================== //售票系統 //整個系統就是一個售票大廳 //每一個執行緒就是一個售票視窗 //只有50張票,5個視窗同時售票 //執行緒 class store extends Thread{ //視窗名稱 private String name; //構造方法 public store(String name) { this.name = name; } //定義公用資料物件: //整個程式只能一個,50張票 public static
int piao = 50; //公共的鑰匙:只要是一個引用型別的物件的就可以 //隨便是什麼名字和型別:必須是引用的 //static:表示只能一把鑰匙 public static String key="key"; //重寫run方法:void,無返回 @Override public void run() { //不間斷售票,售完結束,未知的。 while(true) { //建立鎖的機制:synchronized //當一個執行緒操作資料的時候, //其他執行緒必須等待當前執行緒結束 //當前執行緒是鎖定的,沒有做完,別的執行緒不能執行。 //第一步:建立一把公共的鑰匙 //第二步:建立鎖,指定鑰匙 //建立鎖(鑰匙),包住整個完整的操作 synchronized(store.key) { //判斷 if(store.piao > 0) {////列印票據 try { Thread.currentThread().sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } store.piao--; System.out.println(this.name+"售出一張票,還剩:"+store.piao+"張。"); } else { System.out.println(this.name + "票已售完!"); break;//結束售票 } } } } }