1. 程式人生 > >多執行緒——靜態同步函式的鎖的相關問題

多執行緒——靜態同步函式的鎖的相關問題

package com.qianfeng.demo01;
/**
 * 關於靜態同步函式使用的鎖
 * 
 * 靜態同步函式的鎖是什麼呢?
 * 靜態隨著類的載入而載入,而這時記憶體中儲存的物件至少有一個,也就是該類的位元組碼檔案物件。
 * 
 * 這個物件的表現形式:類名.class  他表示位元組碼檔案物件,   Class類的物件
 * */

public class ThreadDemo03 {

	public static void main(String[] args) {
		SaleTicket02 st = new SaleTicket02();
		System.out.println(st.isFlag());    //true
		Thread t1 = new Thread(st);
		Thread t2 = new Thread(st);
		
		t1.start();   //開啟了執行緒t1,具備執行資格,不一定有執行權利
		try {
			Thread.sleep(10);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		st.setFlag(false);
		t2.start();  //t2也具備了執行資格,不一定有執行權利
	}
}

class SaleTicket02 implements Runnable{

	private static int num = 100;
	private Object obj = new Object();
	private boolean flag = true;
	public void setFlag(boolean flag) {
		this.flag = flag;
	}
	public boolean isFlag() {
		return flag;
	}
	@Override
	public void run() {
		if (flag) {
//			while(true){
//				//類名.class   :表示了位元組碼物件
//				synchronized (SaleTicket02.class) {
//					if (num>0) {
//						try {
//							Thread.sleep(10);
//						} catch (InterruptedException e) {
//							e.printStackTrace();
//						}
//						System.out.println(Thread.currentThread().getName()+"......sale..code..."+num--);
//					}
//				}
//			}
//		}else 
		while(true){
			while(true){
				show();
//			}
//		}
			}
		}
	}
}
	//提取同步程式碼塊當中的內容,在同步函式中進行封裝;
	//靜態方法在載入進入記憶體時,還沒有類的物件呢,但是鎖必須是個物件。
	public static synchronized void show(){
		if (num>0) {
			try {
				Thread.sleep(10);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(Thread.currentThread().getName()+"......sale..function..."+num--);
		}
	}
}