多執行緒_同步的特點及好處和弊端
阿新 • • 發佈:2019-01-06
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) } } }