1. synchronized
- 对象锁
在 Java 中,每个对象都会有一个 monitor 对象,这个对象其实就是 Java 对象的锁,通常会被称为“内置锁”或“对象锁”。类的对象可以有多个,所以每个对象有其独立的对象锁,互不干扰。
- 类锁
在 Java 中,针对每个类也有一个锁,可以称为“类锁”,类锁实际上是通过对象锁实现的,即类的 Class 对象锁。每个类只有一个 Class 对象,所以每个类只有一个类锁。
1.1 根据修饰对象分类
synchronized 可以修饰方法和代码块
1.1.1. 修饰代码块
- synchronized(this|object) {}
- synchronized(类.class) {}
1.1.2. 修饰方法
- 修饰非静态方法
- 修饰静态方法
1.2. 根据获取的锁分类
- 获取对象锁
- synchronized(this|object) {}
- 修饰非静态方法
注意:如果某个类中有多个synchronized修饰的方法,那么同一时刻,对同一个对象,只有一个方法会被执行。因为这里是对象锁,只有一个线程能获取到这个对象的监视器
- 获取类锁
- synchronized(类.class) {}
- 修饰静态方法