当前位置: 首页 > news >正文

synchronized 和 Lock

synchronized 和 Lock

并发编程的核心目标是“正确性 + 性能”。锁机制是实现线程安全的基石。
本文将深入解析 Java 锁的种类、原理、优化机制与最佳实践。


一、为什么需要锁

多个线程同时读写共享资源时,可能发生 竞态条件 (Race Condition)
锁用于控制访问顺序,保证数据一致性。

示例:非线程安全的情况

class Counter {private int count = 0;public void increment() { count++; }
}

若多线程同时执行 increment(),可能出现计数不准确。


二、synchronized 的用法与原理

synchronized 是最基本的同步机制。

用法示例锁对象
修饰方法synchronized void add()当前实例
修饰静态方法synchronized static void add()当前类 Class 对象
修饰代码块synchronized(this)自定义对象

示例:

public synchronized void add() { count++; }public void addSyncBlock() {synchronized (this) {count++;}
}

底层对应 monitorenter / monitorexit 指令,基于对象监视器锁。


三、synchronized 的优化演进

版本优化机制说明
JDK 1.5偏向锁无竞争场景加锁快
JDK 1.6轻量级锁CAS 操作替代重量锁
JDK 1.6+自旋锁、自适应锁避免频繁阻塞唤醒
JDK 1.7+锁消除、锁粗化编译器级优化

四、显式锁:Lock 接口家族

java.util.concurrent.locks 提供了更灵活的加锁机制。

主要类:

特点
ReentrantLock可重入、可中断、公平锁支持
ReentrantReadWriteLock读写分离锁,提高并发性能
StampedLock乐观读锁,高并发性能更优

示例:ReentrantLock 使用

Lock lock = new ReentrantLock();
try {lock.lock();System.out.println("安全访问");
} finally {lock.unlock();
}

五、Lock 与 synchronized 对比

对比项synchronizedLock
可重入性✅ 支持✅ 支持
可中断✅ tryLock 支持
公平锁✅ 可选
自动释放❌ 需手动 unlock
性能自动优化更可控但需谨慎

六、读写锁示例:ReentrantReadWriteLock

class RWExample {private final Map<String, String> cache = new HashMap<>();private final ReadWriteLock lock = new ReentrantReadWriteLock();public String get(String key) {lock.readLock().lock();try { return cache.get(key); }finally { lock.readLock().unlock(); }}public void put(String key, String value) {lock.writeLock().lock();try { cache.put(key, value); }finally { lock.writeLock().unlock(); }}
}

✅ 多读共享,写独占,大幅提升并发性能。


七、Lock 高级技巧:tryLock + Condition

Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();lock.lock();
try {while (!ready) condition.await();// 业务逻辑condition.signalAll();
} finally {lock.unlock();
}

八、CAS 与无锁编程

CAS(Compare And Swap)是 J.U.C 包下常见的无锁机制。
依赖 CPU 原子指令完成更新,典型应用:

  • AtomicInteger、AtomicLong
  • ConcurrentHashMap
  • LongAdder

优点:性能高,不需阻塞。
缺点:可能出现 ABA 问题(可用 AtomicStampedReference 解决)。


九、最佳实践

  • ✅ 优先使用无锁或读写锁结构(如 ConcurrentHashMap)
  • ✅ 使用 synchronized 时锁范围尽量小
  • ✅ 保证锁的释放(finally/unlock)
  • ✅ 避免嵌套锁与死锁
  • ✅ 监控锁竞争与线程状态(使用 JConsole / VisualVM)

总结

锁类型特点使用场景
synchronized简单可靠,自动释放小规模同步
ReentrantLock高级控制、可中断、公平锁复杂同步逻辑
ReadWriteLock多读少写缓存、共享资源
StampedLock乐观读高并发读场景
http://www.dtcms.com/a/533229.html

相关文章:

  • 2.2.1.2 大数据方法论与实践指南-基于飞书项目的项目管理规范
  • 做防腐木网站优秀网站设计流程
  • LangChain最详细教程之Model I/O(二)Prompt Template
  • STM32F103C8T6_UART串口通信完整教程
  • Gorm(一)查询方法
  • 网站管理工具wordpress中文版和英文版区别
  • 新网网站空间到期停了 咋续费北海哪里做网站建设
  • 百日挑战-单词篇(第四天)
  • 6.1 操作系统的启动流程
  • 英语学习 第四天
  • Compose笔记(五十四)--Card
  • 西宁电商网站制作公司北京广告设计招聘
  • 阿里巴巴网站建设销售软件商店下载最新版
  • 交流耦合和直流耦合
  • 印刷厂网站建设方案利用网上菜谱做网站
  • Flutter 中, Flame + flame_forge2d世界坐标和屏幕坐标对齐
  • 石家庄建站网页模板siteservercms做的网站在后台进行修改教程
  • 基于单片机的楼道声光人体红外智能控制灯设计
  • 做热处理工艺的网站有哪些苏州优化外包
  • 给网站怎么做tag标签网站优化公司免费咨询
  • 苏州专业做网站的公司有哪些杭州市优化服务
  • 5 Simplified LPDDR6 State Diagram(简化LPDDR6状态图)
  • 慈利做网站在哪里怎么做免费网站 视频
  • 怎么做赌钱网站网站备案现场
  • 通胀数据加强降息预期 金价周五收于4100美元之上
  • 高级机器学习作业(一)岭回归 + 信息熵 + Sigmoid + Softmax + PCA
  • 莱州网站建设关键字排名优化网络托管微信代运营wordpress 前台 插件
  • Python uv虚拟环境管理工具详解
  • 西安网站制作网站是如何设计配置方案的
  • 线程互斥量