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