對于synchronized的誤解:“synchronized可以鎖定函數或代碼”。其實,synchronized鎖定的不是函數和代碼,對于instance函數,它鎖定的僅僅是函數調用者的對象;對于static函數,則是class類。
class Test {
public synchronized void a1(){ //函數
System.out.println("aaaaaaa11111111");
}
public void a2(){ //對象本身的引用
synchronized(this){
//
System.out.println("aaaaaaa2222222");
}
}
public void a3(OtherObject obj){ /外部對象的引用
synchronized(obj){
//
System.out.println("aaaaaaa33333333");
}
}
}
前兩個通過synchronized獲得lock其實都是一個,雖然不在一個地方使用,使用的方式也不一樣,但是,兩種方式獲得的lock都會交給這個函數的對象(也就是this)。
第三個則由于是外部對象的引用,所以則是另一個lock。