多執行緒-同步程式碼塊(同步的好處和弊端以及同步的前提條件)
阿新 • • 發佈:2021-11-06
1 package multithread.test; 2 3 import com.sun.org.apache.bcel.internal.generic.NEW; 4 5 /* 6 * 賣票 7 */ 8 9 10 /* 11 * 執行緒安全問題產生的原因: 12 * 1,多個執行緒在操作共享的資料。 13 * 2,操作共享資料的執行緒程式碼有多條。 14 * 15 * 當一個執行緒在執行操作共享資料的多條程式碼過程中,其他執行緒參與了運算。 16 * 就會導致執行緒安全問題的產生。 17 * 18 * 19TicketDemo* 解決思路: 20 * 就是將多條操作共享資料的執行緒程式碼封裝起來,當有執行緒在執行這些程式碼的時候 21 * 其他執行緒是不可以參與運算的。 22 * 必須要當前執行緒把這些程式碼都執行完畢後,其他執行緒才可以參與運算。 23 * 24 * 25 * 在java中,用同步程式碼塊就可以解決這個問題。 26 * 27 * 同步程式碼塊的格式: 28 * synchronize(物件){ 29 * 需要被同步的程式碼塊 30 * } 31 * 同步程式碼塊的好處:解決了執行緒的安全問題。 32 * 33 * 34* 同步的弊端:相對降低了效率,因為同步外的執行緒的都會判斷同步鎖。 35 * 36 * 同步的前提:必須有多個執行緒並使用同一個鎖。 37 * 38 * 39 * 40 */ 41 42 43 class Ticket implements Runnable {//extends Thread { 44 private /*static*/ int num = 100;//靜態是可以的,根據實際看,有可能是這個執行緒負責這種100張,另一個執行緒時另一種票100張 45 Object obj = new Object(); 46 publicvoid run() /*throws 不處理就拋,但是實現介面覆蓋的方法,介面沒有宣告過異常,只能catch不能宣告*/{ 47 // Object obj = new Object();//每個執行緒開啟都會建立一個物件,就會有不同鎖,會出錯 48 while(true) { 49 synchronized (obj/*物件鎖或者叫同步鎖*/){ 50 if (num>0) { 51 // try { 52 // Thread.sleep(10);//sleep方法有個丟擲 53 // } catch (InterruptedException e) { 54 // // TODO: handle exception 55 // } 56 // // 57 System.out.println(Thread.currentThread().getName()+"....sale...."+ num--); 58 } 59 } 60 61 62 } 63 } 64 } 65 66 public class TicketDemo { 67 68 public static void main(String[] args) { 69 // TODO Auto-generated method stub 70 71 Ticket t = new Ticket();//建立一個執行緒任務物件。 72 73 74 Thread t1 = new Thread(t); 75 Thread t2 = new Thread(t); 76 Thread t3 = new Thread(t); 77 Thread t4 = new Thread(t); 78 79 t1.start(); 80 t2.start(); 81 t3.start(); 82 t4.start(); 83 /* 84 Ticket t1 = new Ticket(); 85 Ticket t2 = new Ticket(); 86 Ticket t3 = new Ticket(); 87 Ticket t4 = new Ticket(); 88 //只有100張,賣了400張,為什麼? 89 t1.start(); 90 // t1.start();IllegalThreadStateException-無效執行緒狀態異常是 runtime異常 91 // t1.start(); 92 // t1.start(); 93 94 t2.start(); 95 t3.start(); 96 t4.start(); 97 */ 98 99 100 } 101 //cmd 列印完1在前面 比如43列印在後面, cmd是應用程式,虛擬機器也是一個應用程式,cpu也是在這兩個中切換造成的 102 }