类锁:在方法上加上static synchronized的锁,或者synchronized(xxx.class)的锁。
对象锁:就是锁是Java对象。
举例:
public class LockDemo {
private Object object = new Object();
public synchronized void method_01(){}
public void method_02(){
synchronized (this.object) {}
}
public void method_03(){
synchronized (this) {}
}
public void method_04(){
synchronized (LockDemo.class) {}
}
public static synchronized void method_05(){}
}
从上面可以得出:method_01和method_04是类锁,其它三个是对象锁。
做一道题:
有一个类,如下:
public class SynchronizedTest
{ public synchronized void method1(){}
public synchronized void method2(){}
public static synchronized void method3(){}
public static synchronized void method4(){}
}
那么,有SynchronizedTest的两个实例a和b,对于一下的几个选项有哪些能被一个以上的线程同时访问呢?
A. a.method1() vs. a.method2()
B. a.method1() vs. b.method1()
C. a.method3() vs. b.method4()
D. a.method3() vs. b.method3()
E. a.method1() vs. a.method3()
答案是什么呢?BE
method1和method2都是对象锁,method3和method4都是类锁,A选项中两个方法使用的是一个对象锁,所以不能同时访问;B选项中两个方法使用的是两个对象的对象锁,所以可以同时访问;C、D选项的两个方法都是使用的一个类锁,所以不能同时访问;E选项中的两个方法一个是对象锁,一个是类锁,所以可以同时访问