类锁 和 对象锁
1.类锁
先定义这么一个类
ClassT(){
synchronized static methodA(){
}
}
那么 实例化两个对象之后
ClassT a;
ClassT b;
在这两个对象调用methodA时,第一个调用的会得到ClassT类的类锁, 第二个调用的要等到第一个调用结束后释放锁,才能完成调用。在这之前是线程堵塞,等待锁的释放。
2.对象锁
ClassT(){
synchronized methodA(){ //注意这个时候没有static
}
}
实例化两个对象
ClassT a;
ClassT b;
那么这两个对象调用methodA()方法时候是互相不干扰的。 即通过a.methodA()同步方法调用时候得到的是a的对象锁,而通过b.methodA()同步方法调用时候得到的是b的对象锁。
总结:
对象锁 锁的是 类的实例。 而类锁 锁的是类。 对象锁属于对象, 类锁属于类。 而静态方法是属于类的,非静态方法是属于对象实例的