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();
    }
}
  1. 同一个类的不同实例:不同的实例之间有独立的对象锁,彼此互不干扰,可以并行执行同步代码块。
  2. 同一个对象实例的多个线程:同一个对象实例的多个线程访问同步方法时,必须按顺序执行,因为它们共享同一把对象锁(this)。
  3. 不同类的实例:不同类的实例之间也有独立的对象锁,彼此之间互不干扰,能并行执行同步代码块。

synchronized锁类

锁住的是类的Class对象,所有该类的实例都共享这个锁。所有拥有该类实例的线程访问此同步代码块都会互斥。

  • 不同实例dog1dog2)的线程依然会 互斥,因为它们都需要争抢 Dog.class 锁。无论你创建多少个 Dog 类的实例,它们都会共享这个锁。
  • 其他类的实例(例如 Cat 的线程不受影响,它们仍然可以并行执行自己的同步代码块,因为 synchronized(Dog.class) 锁住的是 Dog.class

普通方法锁

锁的是当前对象实例。相当于锁实例。

静态方法锁

锁的是当前类的 Class 对象。相当于锁类