volatile、synchronized、Lock选型指南:4条规则搞定Java并发
·
被问"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,够用就行。
更多实战细节在星球持续更新。
更多推荐



所有评论(0)