锁的概念和常见分类

锁是多线程编程中用于控制并发访问共享资源的重要机制。文章介绍了锁的几种类型,包括乐观锁和悲观锁,以及它们在不同场景下的适用性;公平锁与非公平锁的区别和优缺点;可重入锁与不可重入锁的特性;独占锁和共享锁在读写操作中的应用;并讨论了读写锁(ReadWriteLock)以及死锁的概念和避免策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

锁的概念

锁的常见分类

 乐观锁和悲观锁

公平锁和非公平锁

可重入锁和不可重入锁

独占锁(排它锁)和共享锁

读写锁(ReadWriteLock)

死锁


  • 锁的概念

    • 锁,顾名思义,能用锁单独占有一些东西,让其他人不能正常使用,而在程序中意义就是在多线程情况下,需要用锁去锁住一些共享的资源,只有拿到锁的线程才能访问这些资源,而其它未拿到锁的线程只能等待拿到锁的线程释放锁之后,再去和其他线程竞争锁以获取对资源的访问,目的就是解决在并发操作下共享资源被多个线程访问导致的异常情况(例如数据前后不一致)。
  • 锁的常见分类

    •  乐观锁和悲观锁

      • 乐观锁:乐观锁认为自己在使用数据的时候不会有别的线程修改数据,所以不会添加锁,只是在更新数据的时候去判断之前有没有别的线程修改了数据,如果这个数据没有被更新,当前线程将自己修改的数据成功写入,如果数据已经被其他线程更新,则根据不同的实现方式执行不同的操作
      • 悲观锁:悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改,java中synchronized和lock的实现类都是悲观锁
      • 适用场景:乐观锁适合读数据较多的场景,悲观锁适合写数据较多的场景
    • 公平锁和非公平锁

      • 公平锁:多个线程按照申请锁的先后顺序来获取锁,线程直接进入队列中排队排在前面的线程会优先获得锁
      • 非公平锁:多个线程加锁时直接尝试去获取锁,获取不到才会进入等待队列的队尾等待,但如果此时锁刚好可用,那么这个线程可以无需等待直接获取锁
      • 优缺点
        • 公平锁:
          • 优点:等待锁的线程不会饿死的情况
          • 缺点:唤醒阻塞线程的开销较大
        • 非公平锁:
          • 优点:可以减少唤醒线程的开销,整体的吞吐率较高
          • 缺点:处于等待队列的线程可能会被饿死
    • 可重入锁和不可重入锁

      • 可重入锁:当一个线程获取一个对象上的锁的时候,会自动获取该对象的其他锁,而其他线程不可获取该对象的任何锁(当一个线程获取对象方法外层的锁时,会自动获取内层的锁)
      • 不可重入锁:当一个线程获取一个对象上外层方法的锁的时候,如果接下来的方法又需要获取另一个锁,则需要先等待锁释放才能获取下一个
    • 独占锁(排它锁)和共享锁

      • 独占锁(排它锁):当一个线程获取到锁的时候,其他线程不能再获取该锁,只能进入队列等待锁的释放,此时,获取锁的线程可以读取和写入数据
      • 共享锁:当一个线程获取到共享锁的时候,其他线程也能获取共享锁,但是只能读取数据,不能写入数据
    • 读写锁(ReadWriteLock)

      • 读锁:多个线程可以共享一起执行
      • 写锁:独占锁
    • 死锁

      • 概念:多个进程在运行过程之中因争夺资源而造成的一种僵局
      • 产生四个条件(必须同时满足)
        • 请求与保持条件:一个进程因请求而获得资源而阻塞时,对已获得的资源保持不放
        • 不剥夺资源:进程已获得的资源,在未使用完成前,不能强行剥夺
        • 互斥条件:一个资源只能被一个进程使用
        • 循环等待条件:若干进程之前形成一种头尾相接的循环等待资源关系
      • 解除死锁
        • 剥夺资源:从其他进程中剥夺足够的资源给死锁进程,从而解除死锁
        • 撤销进程:可以直接撤销死锁进程或撤销代价最小的进程,直至资源足够可用,死锁状态消除为止 
<think>好的,我现在需要回答用户关于Java分类的问题。首先,我要回顾用户提供的引用内容,看看里面提到了哪些的类型分类。 引用[1]提到非可重入,独占共享。引用[2][3]主要讲ReentrantLock作为可重入的实现,还有公平非公平的区别。引用[4]则提到synchronized关键字属于独占、悲观、可重入、非公平,还提到了作用范围的不同情况。综合这些信息,Java中的可以从多个维度分类,比如可重入性、公平性、的性质(如悲观/乐观)、独占/共享等。 接下来需要组织这些分类,确保每个类别都有明确的定义例子。例如,按可重入性分为可重入非可重入,但用户提到Java标准库中没有非可重入的实现,可能需要说明这一点。然后,按公平性分为公平非公平,ReentrantLock支持这两种模式。独占共享是另一组分类,像ReentrantLock是独占,而ReadWriteLock中的读是共享。另外,还有悲观乐观,synchronizedReentrantLock属于悲观,而StampedLock的乐观读属于乐观。 要注意引用中的例子,比如ReentrantLock的代码示例,以及synchronized的不同使用方式。需要将这些例子融入分类中,帮助用户理解。同时,用户可能对某些概念不太清楚,比如公平非公平的区别,需要简单解释。 可能还需要检查是否有其他常见类型没有被提到,比如自旋,但根据引用内容,可能不在讨论范围内,所以暂时不加入。最后,生成相关问题,确保问题覆盖分类的各个方面,帮助用户进一步学习。</think>### Java分类及类型解析 Java中的机制是实现多线程同步的核心工具,根据不同的特性应用场景,可以分为以下几类: --- #### 一、**按可重入性分类** 1. **可重入(Reentrant Lock)** - **定义**:线程可以重复获取已持有的,避免死。 - **实现**: - `synchronized`关键字默认支持可重入性[^4]。 - `ReentrantLock`是显式的可重入实现[^2][^3]。 - **示例**: ```java public void outerMethod() { lock.lock(); // 第一次获取 try { innerMethod(); // 再次获取同一 } finally { lock.unlock(); } } ``` 2. **非可重入** - **定义**:同一线程不可重复获取已持有的。 - **现状**:Java标准库未提供现成实现,需自定义[^1]。 --- #### 二、**按公平性分类** 1. **公平** - **规则**:按线程请求顺序分配,避免饥饿。 - **实现**:`ReentrantLock(true)`[^2]。 2. **非公平** - **规则**:允许插队,提高吞吐量但可能引发饥饿。 - **实现**:`synchronized``ReentrantLock()`默认模式[^4][^2]。 --- #### 三、**按的性质分类** 1. **独占(互斥)** - **定义**:同一时间仅一个线程可持有。 - **示例**:`synchronized`、`ReentrantLock`[^4][^2]。 2. **共享** - **定义**:允许多个线程同时读,写时互斥。 - **实现**:`ReadWriteLock`中的读[^1]。 --- #### 四、**按的乐观性分类** 1. **悲观** - **假设**:认为并发冲突频繁,直接加。 - **示例**:`synchronized`、`ReentrantLock`[^4][^2]。 2. **乐观** - **假设**:冲突较少,通过版本号(如CAS)实现。 - **实现**:`StampedLock`的乐观读模式[^1]。 --- #### 五、**其他分类** 1. **自旋** - **特点**:线程通过循环尝试获取,避免上下文切换。 - **适用场景**:竞争低且持有时间短的情况。 2. **分段** - **设计**:将数据分段,每段独立加(如`ConcurrentHashMap`)。 --- ### 总结对比 | 分类维度 | 类型 | 特点/实现 | |----------------|---------------|-----------------------------------| | **可重入性** | 可重入 | `synchronized`, `ReentrantLock` | | | 非可重入 | 需自定义[^1] | | **公平性** | 公平 | `ReentrantLock(true)`[^2] | | | 非公平 | 默认模式 | | **性质** | 独占 | 互斥访问 | | | 共享 | 读共享,写互斥 | | **乐观性** | 悲观 | 直接加 | | | 乐观 | CAS或版本控制 | --- 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值