温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Synchronized 是什么

发布时间:2026-07-25 16:10:20 来源:亿速云 阅读:94 作者:小樊 栏目:编程语言

synchronizedJava 中用于实现线程同步的关键字,主要作用是保证同一时刻只有一个线程可以执行某段代码或访问某个方法,从而避免多线程并发带来的数据不一致问题。

下面从 是什么、怎么用、底层原理、常见注意点 四个方面说明。


一、synchronized 是什么?

synchronized 是 Java 的内置锁机制,用来实现:

  • 原子性:同一时刻只有一个线程执行
  • 可见性:线程对变量的修改对其他线程立即可见
  • 有序性:防止指令重排序

它是 悲观锁,也是 可重入锁


二、synchronized 的三种用法

1️⃣ 修饰实例方法(锁的是当前对象)

public synchronized void method() {
    // 同一时刻只能有一个线程访问这个方法
}
  • 锁对象:this
  • 不同对象之间 互不影响

2️⃣ 修饰静态方法(锁的是 Class 对象)

public static synchronized void method() {
    // 锁的是当前类的 Class 对象
}
  • 锁对象:类名.class
  • 所有线程共享同一把锁

3️⃣ 修饰代码块(锁的是指定对象)

synchronized (lockObject) {
    // 临界区代码
}

最推荐的方式,粒度更细、更灵活


三、synchronized 的底层原理

1️⃣ 基于对象头 + Monitor(监视器锁)

每个 Java 对象在内存中都有:

  • 对象头(Mark Word)
  • 指向 Monitor(监视器)的指针

synchronized 本质:

对对象头中的 Mark Word 进行操作,获取 Monitor 锁


2️⃣ 字节码层面

synchronized(obj) {
    ...
}

编译后会有:

  • monitorenter
  • monitorexit

JVM 保证:

  • 正常执行 → 释放锁
  • 异常执行 → 也会释放锁

3️⃣ 锁升级过程(JDK 1.6 之后)

synchronized 不是一开始就“很重”,而是逐步升级

无锁
  ↓
偏向锁(只有一个线程)
  ↓
轻量级锁(少量竞争,CAS)
  ↓
重量级锁(真正阻塞线程)

✅ 大幅提升了性能


四、synchronized 的特性

✅ 可重入

synchronized void a() {
    b();
}

synchronized void b() {
    // 同一线程可以再次进入
}

✅ 不可中断

  • 线程等待锁时 不能中断
  • 这是和 ReentrantLock 的重要区别

❌ 不能尝试获取锁

  • 没有 tryLock
  • 一旦竞争就只能等

五、synchronized vs ReentrantLock

对比项 synchronized ReentrantLock
用法 简单 灵活
可中断
尝试获取锁
公平锁
性能 已优化 略优(复杂场景)

六、什么时候用 synchronized?

✅ 推荐使用场景:

  • 简单的同步需求
  • 锁粒度小
  • 不要求高级功能(中断、超时)

✅ 示例:

private int count = 0;

public void increment() {
    synchronized (this) {
        count++;
    }
}

七、一句话总结

synchronized 是 Java 内置的同步机制,通过对象锁保证线程安全,底层依赖对象头和 Monitor,经过锁升级优化后性能已非常优秀。

如果你愿意,我也可以:

  • 生活例子 解释 synchronized
  • 对比 synchronized 和 volatile
  • 面试常问的 synchronized 问题
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI