1. 程式人生 > >(多執行緒-靜態同步函式的鎖是Class物件)

(多執行緒-靜態同步函式的鎖是Class物件)


/*
如果同步函式被靜態修飾後,使用的鎖是什麼呢?

通過驗證,發現不在是this。因為靜態方法中也不可以定義this。

靜態進記憶體是,記憶體中沒有本類物件,但是一定有該類對應的位元組碼檔案物件。
類名.class  該物件的型別是Class


靜態的同步方法,使用的鎖是該方法所在類的位元組碼檔案物件。 類名.class
*/
class Ticket implements Runnable
{
    private static  int tick = 100;
    //Object obj = new Object();
    boolean flag = true;
    public
void run() { if(flag) { while(true) { synchronized(Ticket.class) { if(tick>0) { try{Thread.sleep(10);}catch(Exception e){} System.out.println(Thread.currentThread().getName()+"....code : "
+ tick--); } } } } else while(true) show(); } public static synchronized void show() { if(tick>0) { try{Thread.sleep(10);}catch(Exception e){} System.out.println(Thread.currentThread().getName()+"....show.... : "
+ tick--); } } } class StaticMethodDemo { public static void main(String[] args) { Ticket t = new Ticket(); Thread t1 = new Thread(t); Thread t2 = new Thread(t); t1.start(); try{Thread.sleep(10);}catch(Exception e){} t.flag = false; t2.start(); } }