1. 对象锁
修饰在非静态方法或者锁对象为普通对象。
多个线程调用同一个对象的同步方法会阻塞,调用不同对象的同步方法不会阻塞。(java 对象的内存地址是否相同)
// 非静态方法
public synchronized void obj3() {
}
// 普通对象
synchronized (this) {
}
2. 类锁
修饰静态方法或锁对象为 class
无论多少个对象, 共享同一个锁(锁定在该类的 class 上或者是 classloader 对象上),保障同一个时刻多个线程同时访问同一个 synchronized 块,当一个线程在访问时,其他的线程等待。
// 静态方法
public static synchronized void obj3() {
}
// 锁对象为 class
synchronized (test.class) {
}