1. 程式人生 > >JAVA 同步函式以this為鎖

JAVA 同步函式以this為鎖

//僅作為學習筆記

/*
	同步函式用的是this鎖
	
	函式需要被物件呼叫。那麼函式都有一個所屬物件呼叫,就是this
	所以同步函式使用的鎖是this

	
	通過該程式進行驗證

	使用兩個執行緒來賣票

	一個執行緒在同步程式碼塊中
	一個執行緒在同步函式中
	都在執行賣票操作


*/

class Ticket implements	Runnable
{
	private int tick = 1000;
	
	//Object obj = new Object();

	boolean flag = true;

	public void run()
	{
		if(flag)//第一個進入的執行緒實行下面程式碼
		{
				while(true)
				{
					//synchronized(obj)//由於同步函式的是以this物件為鎖的 此處如果使用obj物件作為鎖
										//則不能實現同步 輸出的資料會出現錯誤 程式的安全性不能得到保證
					synchronized(this)//和下面的show函式使用同樣的鎖 可以保證同步
					{
						if(tick>0)
						{
							try{Thread.sleep(40);}catch(Exception e){}
							System.out.println(Thread.currentThread().getName() +" .....code..."+ tick--);

						}
					}
				}
		}//第二個進入的程式碼實行下面程式碼
		else
			while(true)
				show();//this.show();
	
	}
	public synchronized void show()//同步函式 以this為鎖
	{
		if(tick>0)
		{
			try{Thread.sleep(40);}catch(Exception e){}
			System.out.println(Thread.currentThread().getName() +" .....show..."+ tick--);
		}		
	}

}


class ThisLockDemo
{
	public static void main(String []args)
	{
		Ticket t = new Ticket();
		Thread t1 = new Thread(t);
		Thread t2 = new Thread(t);
	
		t1.start();//開啟第一個執行緒  但不一定馬上執行
		
		t.flag = false;//改變標誌
		try{Thread.sleep(40);}catch(Exception e){}//讓主執行緒睡眠40毫秒  保證第一個執行緒先開始執行 且標誌位改變

		t2.start();	
	}
}