1. 程式人生 > 其它 >多執行緒-同步程式碼塊(同步的好處和弊端以及同步的前提條件)

多執行緒-同步程式碼塊(同步的好處和弊端以及同步的前提條件)

  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  * 
 19
* 解決思路: 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 public
void 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 }
TicketDemo