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

Java基础夯实——2.6 Java中的锁

Java 中,锁(Lock)是用于控制多线程并发访问共享资源的工具。它可以确保在同一时刻只有一个线程能够访问共享资源,从而避免数据不一致的问题。

1. 内置锁(synchronized 关键字)

Java 提供了内置锁,也称为监视器锁,这是最简单和常用的锁机制。

  • 同步方法:锁住整个方法,锁的对象是 this(实例锁)或类对象(类锁)。
    public synchronized void exampleMethod() {
        // 临界区代码
    }
    
  • 同步代码块:锁定指定对象,粒度更细。
    public void exampleMethod() {
        synchronized (this) {
            // 临界区代码
        }
    }
    

特点

  • 自动获取和释放锁。
  • 简单易用,但可能导致线程阻塞。
  • 不支持尝试获取锁、超时获取锁或中断锁等高级功能。

2. 显式锁(java.util.concurrent.locks.Lock 接口)

显式锁提供了更灵活的锁定机制,允许显式获取和释放锁。

主要实现类

  1. ReentrantLock(可重入锁)

    • 支持公平锁和非公平锁。
    • 允许尝试获取锁、超时获取锁或中断锁。
    Lock lock = new ReentrantLock();
    try {
        lock.lock(); // 获取锁
        // 临界区代码
    } finally {
        lock.unlock(); // 确保释放锁
    }
    
  2. ReentrantReadWriteLock(读写锁)

    • 提供读锁(共享锁)和写锁(独占锁),适合读多写少的场景。
    • 读线程可以并发,写线程则独占。
    ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
    lock.readLock().lock(); // 读操作
    lock.writeLock().lock(); // 写操作
    

特点

  • 更灵活,支持多种高级功能。
  • 使用时需要手动管理锁的获取和释放,容易引发死锁。
  • 性能可能优于 synchronized,尤其是在高并发情况下。

3. StampedLock

  • StampedLock 是一种改进的读写锁,提供了乐观读锁(Optimistic Read),适合读多写少的场景。

  • ReentrantReadWriteLock 不同,StampedLock 不是可重入的。

    StampedLock lock = new StampedLock();
    long stamp = lock.readLock();
    try {
        // 读操作
    } finally {
        lock.unlockRead(stamp);
    }
    

4. 信号量(Semaphore)

  • Semaphore 用于控制同时访问某个资源的线程数量。

  • 常用于限制连接数或资源池的并发访问。

    Semaphore semaphore = new Semaphore(3); // 最大并发数为3
    try {
        semaphore.acquire(); // 获取许可
        // 临界区代码
    } finally {
        semaphore.release(); // 释放许可
    }
    

5. 偏向锁、轻量级锁和重量级锁

  • Java 虚拟机(JVM)底层对 synchronized 的实现进行了优化,包括偏向锁、轻量级锁和重量级锁。
  • 这些锁的选择由 JVM 根据竞争情况动态决定,以提高性能。

比较与选择

特性synchronizedReentrantLockStampedLock
使用难度简单较复杂较复杂
性能较低较高较高
可重入性
读写锁支持支持(需额外类)支持
手动管理锁

http://www.kler.cn/a/404258.html

相关文章:

  • 【AIGC】如何使用高价值提示词Prompt提升ChatGPT响应质量
  • 《操作系统》实验内容 实验二 编程实现进程(线程)同步和互斥(Python 与 PyQt5 实现)
  • 2025计算机毕设选题精选推荐【小程序方向】
  • STM32H7开发笔记(2)——H7外设之多路定时器中断
  • 天润融通携手挚达科技:AI技术重塑客户服务体验
  • iPhone 17 Air看点汇总:薄至6mm 刷新苹果轻薄纪录
  • 【Linux网络编程】套接字使用--TCP echo server的实现
  • 【腾讯云产品最佳实践】腾讯云CVM入门技术与实践:通过腾讯云快速构建云上应用
  • Jmeter中的断言(三)
  • 《Vue零基础入门教程》第一课:Vue简介
  • 初识ArkUI
  • SAP BC 记录一次因为HANA服务器内存满的问题
  • 如何选择合适的数据集成工具或平台来实现全域数据的高效整合
  • 机器学习之量子机器学习(Quantum Machine Learning, QML)
  • Lucene数据写入与数据刷盘机制
  • 0基础跟德姆(dom)一起学AI NLP自然语言处理01-自然语言处理入门
  • 实验室管理现代化:Spring Boot技术方案
  • ros2--实时性--preempt-rt
  • 系统安全第十四次作业题目及答案
  • 备赛蓝桥杯--算法题目(1)
  • AWS云服务器:开启高效计算的新纪元
  • YOLOP 多任务算法详解
  • 几种常用的检查网络连通状态的指令
  • 构建自己的框架去做技术选型
  • ChatGPT高级语音模式正在向Web网页端推出!
  • (十八)JavaWeb后端开发案例——会话/yml/过滤器/拦截器