被问"volatile和synchronized有什么区别",你能秒答吗?

Java并发编程绕不过三个关键字/类:volatile、synchronized、ReentrantLock。很多开发者用了好几年,还是凭感觉选。今天用4条规则帮你建立清晰的选型标准。

规则一:只需可见性 → volatile

volatile保证变量修改对其他线程立刻可见,但不保证原子性。适用场景:状态标志位(如停止信号)、DCL单例模式中的instance变量。记住:volatile的三个特性是可见性、禁止指令重排序、不保证原子性。

规则二:简单互斥 → synchronized

JDK 6之后,JVM对synchronized做了大幅优化:偏向锁 → 轻量级锁 → 重量级锁三级升级。大部分场景性能很好,"synchronized很重"是过时的说法。简单同步场景,synchronized是首选——它自动释放,不会因为忘记unlock导致死锁。

规则三:需要高级控制 → ReentrantLock

ReentrantLock有四个synchronized给不了的能力:

  • 公平锁(按等待顺序获取,避免线程饥饿)
  • 可中断的等待(lockInterruptibly,避免无限阻塞)
  • 超时获取(tryLock with timeout,获取不到就放弃)
  • 多条件变量(Condition,实现精准的线程间通信)

如果你的场景不需要这些,synchronized就够了。

规则四:能不用锁就不用锁

  • 计数器?用AtomicInteger/AtomicLong代替锁
  • 并发集合?用ConcurrentHashMap,别自己加锁包装HashMap
  • 异步任务?用线程池,别手动new Thread
  • 线程池记住7个参数:corePoolSize、maxPoolSize、keepAliveTime、unit、workQueue、threadFactory、handler

一句话总结:选锁像选工具——先明确你要解决什么问题,再选最轻量的方案。volatile < synchronized < ReentrantLock,够用就行。
在这里插入图片描述

更多实战细节在星球持续更新。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐