一、Synchronized 简介
Synchronized 是 Java 中一种用于线程同步的关键字,可以用来修饰代码块或方法,保证线程安全。在 Java 中,每个对象都有一个内部锁,也称为监视器锁或互斥锁,它可以被 Synchronized 关键字所获取。获取锁的线程可以访问该对象的共享资源,其他线程则被阻塞。当获取锁的线程执行完毕后,会释放锁,其他线程才可以获取该锁并继续执行。
二、Synchronized 的实现原理
Synchronized 关键字的实现是通过 Java 对象头上的标记来实现的。Java 对象头包含了两个信息:对象的哈希码和锁状态。其中锁状态包括了两个部分:是否被锁定和锁定的线程。当一个线程获取对象的锁时,JVM 会将对象头上的锁状态设置为“已锁定”,并将当前线程 ID 记录下来。如果其他线程尝试获取这个对象的锁,就会进入阻塞状态。当持有锁的线程执行完毕后,JVM 会将对象头上的锁状态设置为“未锁定”,并唤醒被阻塞的线程。
由于 Synchronized 是通过对象头上的锁状态来实现的,所以它只能锁定对象,而不能锁定基本类型。当需要锁定基本类型时,需要使用 Java 中的锁机制之一,例如 ReentrantLock。
三、Synchronized 的优化
1. 减小锁的粒度
Synchronized 是一种独占式锁,即同一时刻只能有一个线程获取到锁,其他线程则被阻塞。如果一个方法中只有一小段代码需要同步,而其他代码不需要同步,那么可以将需要同步的代码块进行细分,以减小锁的粒度。例如:
public void method() {
synchronized(this) {
/