物件鎖 與 類鎖

2021-09-24 10:02:22 字數 2589 閱讀 4174

原文:

一  什麼是物件鎖

物件鎖也叫方法鎖,是針對乙個物件例項的,它只在該物件的某個記憶體位置宣告乙個標識該物件是否擁有鎖,所有它只會鎖住當前的物件,而並不會對其他物件例項的鎖產生任何影響,不同物件訪問同乙個被synchronized修飾的方法的時候不會阻塞,

例如:publicclassmyobjectcatch(interruptedexception e)

}

//synchronized修飾為同步方法,如果先呼叫method1,則4秒後才會呼叫method2

//如果不用synchronized修飾,則可以直接非同步呼叫,沒有影響

privatevoidmethod2()

}

建立乙個類,synchronized修飾普通方法,即為物件鎖,那麼這個時候,多個執行緒訪問同乙個物件例項的這個方法時,是會同步的,並且只有乙個執行緒執行完,另乙個執行緒才會執行:

publicstaticvoidmain(string args)

},"t1");

thread t2=newthread (newrunnable()

},"t2");

t1.start();

t2.start();

}

即,列印t14秒之後,t2才會列印,因為兩個執行緒呼叫的是同乙個物件例項的方法,即同一把鎖,所有會同步執行

而如果是不同物件例項的話,則沒有影響,因為兩個執行緒呼叫的是不同例項的鎖方法,即不是同一把鎖,沒有關係,所以會正常輸出,不會同步

publicstaticvoidmain(string args)

},"t1");

thread t2=newthread (newrunnable()

},"t2");

t1.start();

t2.start();

}

二 物件鎖的幾種形式以及應用案例

1 synchronized修飾普通方法屬於物件鎖,

synchronized修飾的**塊傳入this也屬於物件鎖

應用:減小鎖粒度,第二種形式就比較好,比如a執行緒呼叫乙個同步方法需要很長時間,那麼b就要等待很長時間,這個時候可以將必須同步的**使用synchronized**塊,

不不需要同步的先執行,節約資源

三 類鎖

類鎖是鎖住整個類,當有多個執行緒來宣告這個類的物件時候將會被阻塞,直到擁有這個類鎖的物件唄銷毀或者主動釋放了類鎖,這個時候在被阻塞的執行緒被挑選出乙個占有該類鎖,宣告該類的物件。其他執行緒繼續被阻塞住

上面方法加static變類鎖:

privatestaticsynchronizedvoidmethod1()catch(interruptedexception e)

}

這個時候無論執行緒呼叫的是多少個物件例項的方法,都會同步

四 類鎖形式

1 synchronized修飾靜態方法屬於類鎖

物件鎖與類鎖

public class classlock public static void main string args for int i 0 i 3 i 輸出 thread 0 0thread 0 1thread 0 2thread 2 3thread 2 4thread 2 5thread 2 6...

synchronized物件鎖與類鎖

以前以為這兩個鎖是乙個鎖,最近測試了一下發現並不是這樣 如下 public class cusandpro public static synchronized void test2 catch interruptedexception e public static void main strin...

類鎖與物件鎖例項

public class radio catch interruptedexception e system.out.println classlock end,name public synchronized void instancelock catch interruptedexception...