多執行緒-同步程式碼塊解決執行緒安全問題的解釋以及同步的特點及好處和弊端

ZHOU_VIP發表於2017-06-03

package cn.itcast_10;

public class SellTicket implements Runnable {

	// 定義100張票
	private int tickets = 100;

	// 定義同一把鎖
	private Object obj = new Object();

	@Override
	public void run() {
		while (true) {
			// t1,t2,t3都能走到這裡
			// 假設t1搶到CPU的執行權,t1就要進來
			// 假設t2搶到CPU的執行權,t2就要進來,發現門是關著的,進不去。所以就等著。
			// 門(開,關)
			synchronized (obj) { // 發現這裡的程式碼將來是會被鎖上的,所以t1進來後,就鎖了。(關)
				if (tickets > 0) {
					try {
						Thread.sleep(100); // t1就睡眠了
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println(Thread.currentThread().getName() + "正在出售第" + (tickets--) + "張票 ");
					//視窗1正在出售第100張票
				}
			} //t1就出來可,然後就開門。(開)
		}
	}
}


package cn.itcast_10;

/*
 * 舉例:
 * 		火車上廁所。
 * 
 * 同步的特點:
 * 		前提:
 * 			多個執行緒
 *		解決問題的時候要注意:
 *			多個執行緒使用的是同一個鎖物件
 * 同步的好處 
 *		同步的出現解決了多執行緒的安全問題。
 * 同步的弊端
 *		當執行緒相當多時,因為每個執行緒都會去判斷同步上的鎖,這是很耗費資源的,無形中會降低程式的執行效率。
 */
public class SellTicketDemo {
	public static void main(String[] args) {
		// 建立資源物件
		SellTicket st = new SellTicket();

		// 建立三個執行緒物件
		Thread t1 = new Thread(st, "視窗1");
		Thread t2 = new Thread(st, "視窗2");
		Thread t3 = new Thread(st, "視窗3");

		// 啟動執行緒
		t1.start();
		t2.start();
		t3.start();
	}
}


相關文章