java-靜態同步函式的鎖是Class物件
阿新 • • 發佈:2019-01-26
/* 如果同步函式被靜態修飾後,使用的鎖是什麼呢? * 通過驗證,發現不在是this。因為靜態方法中也不可以定義this * 靜態進記憶體是,記憶體中沒有本類物件,但是一定有該類對應的位元組碼檔案物件。 * 類名.class 該物件的型別是Class * 靜態的同步方法使用的鎖是該方法所在類的位元組碼檔案物件。 類名.class * */ public class ThisLockDemo { public static void main(String[] args) { Ticke t = new Ticke(); Thread t1 = new Thread(t); Thread t2 = new Thread(t); t1.start(); try { Thread.sleep(10); } catch (Exception e) { } t.flag = false; t2.start(); } } class Ticke implements Runnable { private static int tick = 100; boolean flag = true; public void run() { if (flag) { while (true) { synchronized (Ticke.class) { if (tick > 0) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "...code :" + tick--); } } } } else while (true) show(); } public static synchronized void show() { if (tick > 0) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "sale:"+ tick--); } } }