1. 程式人生 > >多執行緒_同步的特點及好處和弊端

多執行緒_同步的特點及好處和弊端

package cn.itcast_10;

/*
 * 舉例:
 * 		火車上廁所。
 * 		一節車箱裡面的所有人(多執行緒),1號座位去上廁所(共享資源)門(synchronized)關上了,其它人進不去了。
 * 
 * 同步的特點:
 * 		前提:
 * 			多執行緒。
 * 		解決問題的時候要注意:
 * 			多個執行緒使用的是同一個鎖物件。
 * 		同步的好處:
 * 			同步的出現解決了多執行緒的安全問題。
 * 		同步的弊端:
 * 			當執行緒相當多時,因為每個執行緒會判斷同步上的鎖,這是很耗費資源的,無形中會降低程式的執行效率。
 */
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();
	}
}
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) {
						System.out.println("執行緒中斷");
						// e.printStackTrace();
					}

					System.out.println(Thread.currentThread().getName()
							+ "正在出售第" + (tickets--) + "張票");
					// 視窗1正在出售第100張票
				}
			}// t1就出來了,然後就開門。(開)(賣出一張後,繼續搶cpu)
		}
	}

}