多執行緒-驗證同步函式的鎖
阿新 • • 發佈:2021-11-09
1 package multithread.test; 2 3 /* 4 * 同步函式使用的鎖是this 5 * 6 * 同步函式和同步程式碼塊的區別: 7 * 同步函式的鎖是固定的this。 8 * 9 * 同步程式碼塊的鎖是任意的物件 10 * 11 * 建議使用同步程式碼塊 12 */ 13 class Ticket implements Runnable {//extends Thread { 14 private /*static*/ int num = 100;//靜態是可以的,根據實際看,有可能是這個執行緒負責這種100張,另一個執行緒時另一種票100張SynFunctionLockDemo15 Object obj = new Object(); 16 boolean flag = true; 17 public void run() /*throws 不處理就拋,但是實現介面覆蓋的方法,介面沒有宣告過異常,只能catch不能宣告*/{ 18 // Object obj = new Object();//每個執行緒開啟都會建立一個物件,就會有不同鎖,會出錯 19 System.out.println("this:"+this); 20 if (flag) { 21 while(true) {22 synchronized (this) { 23 if (num>0) { 24 try { 25 Thread.sleep(10);//sleep方法有個丟擲 26 } catch (InterruptedException e) { 27 } 28 // 29 System.out.println(Thread.currentThread().getName()+"....sale...."+ num--);30 } 31 } 32 33 } 34 }else { 35 while(true) { 36 this.show(); 37 } 38 } 39 40 } 41 public synchronized void show() { 42 if (num>0) { 43 try { 44 Thread.sleep(10);//sleep方法有個丟擲 45 } catch (InterruptedException e) { 46 } 47 // 48 System.out.println(Thread.currentThread().getName()+"....function...."+ num--); 49 } 50 } 51 } 52 //會出現兩個相同的票數,可能會出現0票,因為用了不同的鎖,同步函式的鎖和程式碼塊的鎖不一樣,同步函式僅僅是函式代表了同步性,本身不帶鎖, 53 public class SynFunctionLockDemo { 54 55 public static void main(String[] args) { 56 // TODO Auto-generated method stub 57 Ticket t = new Ticket();//建立一個執行緒任務物件。 58 59 System.out.println("t:"+t); 60 Thread t1 = new Thread(t); 61 Thread t2 = new Thread(t); 62 // Thread t3 = new Thread(t); 63 // Thread t4 = new Thread(t); 64 65 t1.start(); 66 try { 67 Thread.sleep(10); 68 } catch (InterruptedException e) { 69 70 } 71 t.flag = false; 72 t2.start(); 73 // t3.start(); 74 // t4.start(); 75 } 76 77 }