synchronized锁实例
class Dog {
public void bark() {
synchronized(this) {
System.out.println(Thread.currentThread().getName() + " is barking");
try { Thread.sleep(1000); } catch (InterruptedException e) {}
}
}
}
public class Test {
public static void main(String[] args) {
Dog dog1 = new Dog();
Dog dog2 = new Dog();
// 创建线程分别调用 dog1 和 dog2 的同步方法
Thread t1 = new Thread(() -> dog1.bark());
Thread t2 = new Thread(() -> dog2.bark());
t1.start();
t2.start();
}
}
- 同一个类的不同实例:不同的实例之间有独立的对象锁,彼此互不干扰,可以并行执行同步代码块。
- 同一个对象实例的多个线程:同一个对象实例的多个线程访问同步方法时,必须按顺序执行,因为它们共享同一把对象锁(
this
)。 - 不同类的实例:不同类的实例之间也有独立的对象锁,彼此之间互不干扰,能并行执行同步代码块。
synchronized锁类
锁住的是类的Class对象,所有该类的实例都共享这个锁。所有拥有该类实例的线程访问此同步代码块都会互斥。
- 不同实例(
dog1
和dog2
)的线程依然会 互斥,因为它们都需要争抢Dog.class
锁。无论你创建多少个Dog
类的实例,它们都会共享这个锁。 - 其他类的实例(例如
Cat
) 的线程不受影响,它们仍然可以并行执行自己的同步代码块,因为synchronized(Dog.class)
锁住的是Dog.class
。
普通方法锁
锁的是当前对象实例。相当于锁实例。
静态方法锁
锁的是当前类的 Class
对象。相当于锁类