天天看點

用線程同步賣票

用線程同步賣票

package com.zk920;
/**
 * 練習:賣票,售票視窗1,售票視窗2,售票視窗3
 * 			 賣票量:50張;
 * 
 * 同步 保證資料的完整性
 * 同步代碼塊--->産生的問題就是線程的安全性  互斥鎖機制
 * 格式:
 * synchronized (鎖的對象) {
 * 		需要被執行的同步代碼
 * }
 * 1,鎖的對象可以使用任何對象
 * 2,鎖對象必須是多個線程共享的對象
 * 3,線程調用sleep的方法,這時不會釋放鎖
 * 4,隻有會出現線程安全的時候,才會使用同步機制
 * 
 */

class Sale extends Thread {
	
	static int num = 1000;
	
	
	public Sale(String name) {
		super(name);  //調用父類Thread一個參數的構造方法,初始化的是線程的名字
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		while (true) {
			synchronized ("鎖") {		//鎖這個地方寫什麼都行,但是必須是個對象,不能是數
				if (num>0) {
					System.out.println(Thread.currentThread().getName()+"賣了"+num+"号票...");
					num--;
				}
				else{
					System.out.println("賣完了");
					break;
				}
			}
			
		}
	}
}

public class Demo4 {

	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//生成售票視窗
		Sale sale1 = new Sale("售票視窗1");
		Sale sale2 = new Sale("售票視窗2");
		Sale sale3 = new Sale("售票視窗3");
		
		sale1.start();
		sale2.start();
		sale3.start();

	}

}
           

繼續閱讀