多執行緒——靜態同步函式的鎖的相關問題
阿新 • • 發佈:2019-02-02
package com.qianfeng.demo01; /** * 關於靜態同步函式使用的鎖 * * 靜態同步函式的鎖是什麼呢? * 靜態隨著類的載入而載入,而這時記憶體中儲存的物件至少有一個,也就是該類的位元組碼檔案物件。 * * 這個物件的表現形式:類名.class 他表示位元組碼檔案物件, Class類的物件 * */ public class ThreadDemo03 { public static void main(String[] args) { SaleTicket02 st = new SaleTicket02(); System.out.println(st.isFlag()); //true Thread t1 = new Thread(st); Thread t2 = new Thread(st); t1.start(); //開啟了執行緒t1,具備執行資格,不一定有執行權利 try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } st.setFlag(false); t2.start(); //t2也具備了執行資格,不一定有執行權利 } } class SaleTicket02 implements Runnable{ private static int num = 100; private Object obj = new Object(); private boolean flag = true; public void setFlag(boolean flag) { this.flag = flag; } public boolean isFlag() { return flag; } @Override public void run() { if (flag) { // while(true){ // //類名.class :表示了位元組碼物件 // synchronized (SaleTicket02.class) { // if (num>0) { // try { // Thread.sleep(10); // } catch (InterruptedException e) { // e.printStackTrace(); // } // System.out.println(Thread.currentThread().getName()+"......sale..code..."+num--); // } // } // } // }else while(true){ while(true){ show(); // } // } } } } } //提取同步程式碼塊當中的內容,在同步函式中進行封裝; //靜態方法在載入進入記憶體時,還沒有類的物件呢,但是鎖必須是個物件。 public static synchronized void show(){ if (num>0) { try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"......sale..function..."+num--); } } }