原文:
一 什麼是物件鎖
物件鎖也叫方法鎖,是針對乙個物件例項的,它只在該物件的某個記憶體位置宣告乙個標識該物件是否擁有鎖,所有它只會鎖住當前的物件,而並不會對其他物件例項的鎖產生任何影響,不同物件訪問同乙個被synchronized修飾的方法的時候不會阻塞,
例如:public
class
myobject
catch
(interruptedexception e)
}
//synchronized修飾為同步方法,如果先呼叫method1,則4秒後才會呼叫method2
//如果不用synchronized修飾,則可以直接非同步呼叫,沒有影響
private
void
method2()
}
建立乙個類,synchronized修飾普通方法,即為物件鎖,那麼這個時候,多個執行緒訪問同乙個物件例項的這個方法時,是會同步的,並且只有乙個執行緒執行完,另乙個執行緒才會執行:
public
static
void
main(string args)
},
"t1"
);
thread t2=
new
thread (
new
runnable()
},
"t2"
);
t1.start();
t2.start();
}
即,列印t14秒之後,t2才會列印,因為兩個執行緒呼叫的是同乙個物件例項的方法,即同一把鎖,所有會同步執行
而如果是不同物件例項的話,則沒有影響,因為兩個執行緒呼叫的是不同例項的鎖方法,即不是同一把鎖,沒有關係,所以會正常輸出,不會同步
public
static
void
main(string args)
},
"t1"
);
thread t2=
new
thread (
new
runnable()
},
"t2"
);
t1.start();
t2.start();
}
二 物件鎖的幾種形式以及應用案例
1 synchronized修飾普通方法屬於物件鎖,
synchronized修飾的**塊傳入this也屬於物件鎖
應用:減小鎖粒度,第二種形式就比較好,比如a執行緒呼叫乙個同步方法需要很長時間,那麼b就要等待很長時間,這個時候可以將必須同步的**使用synchronized**塊,
不不需要同步的先執行,節約資源
三 類鎖
類鎖是鎖住整個類,當有多個執行緒來宣告這個類的物件時候將會被阻塞,直到擁有這個類鎖的物件唄銷毀或者主動釋放了類鎖,這個時候在被阻塞的執行緒被挑選出乙個占有該類鎖,宣告該類的物件。其他執行緒繼續被阻塞住
上面方法加static變類鎖:
private
static
synchronized
void
method1()
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...