1. synchronized

  • 对象锁

在 Java 中,每个对象都会有一个 monitor 对象,这个对象其实就是 Java 对象的锁,通常会被称为“内置锁”或“对象锁”。类的对象可以有多个,所以每个对象有其独立的对象锁,互不干扰。

  • 类锁

在 Java 中,针对每个类也有一个锁,可以称为“类锁”,类锁实际上是通过对象锁实现的,即类的 Class 对象锁。每个类只有一个 Class 对象,所以每个类只有一个类锁。

1.1 根据修饰对象分类

synchronized 可以修饰方法和代码块

1.1.1. 修饰代码块

  • synchronized(this|object) {}
  • synchronized(类.class) {}

1.1.2. 修饰方法

  • 修饰非静态方法
  • 修饰静态方法

1.2. 根据获取的锁分类

  • 获取对象锁
  1. synchronized(this|object) {}
  2. 修饰非静态方法

    注意:如果某个类中有多个synchronized修饰的方法,那么同一时刻,对同一个对象,只有一个方法会被执行。因为这里是对象锁,只有一个线程能获取到这个对象的监视器

  • 获取类锁
  1. synchronized(类.class) {}
  2. 修饰静态方法