对于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。