【锁思想】锁的7大分类及特点 - 了解并发编程中的锁机制

TodoCoder大约 6 分钟Java锁思想编程思想

   本文首先为您提供锁的分类概念和标准,帮助您全面了解锁的种类。在后续课程中,我们将深入讲解重要的锁类型及其实现原理,助您更好地应用于实际场景。

锁的 7 大分类

值得一提的是,这些多样化的分类标准是评价事物的多种方式。例如,评一个城市时,我们会考虑人口数量、经济发展程度、城市面积等因素。一个城市可能同时满足多个标准,如北京人口众多、经济发达且城市面积辽阔。

类似地,在Java中一把锁可能同时符合多个标准属于多种分类。例如,ReentrantLock既是可中断锁,又是可重入锁。

根据分类标准,我们将锁分为以下7大类别:

  • 偏向锁/轻量级锁/重量级锁;
  • 可重入锁/非可重入锁;
  • 可中断锁/不可中断锁。
  • 共享锁/独占锁;
  • 悲观锁/乐观锁;
  • 公平锁/非公平锁;
  • 自旋锁/非自旋锁;

接下来,我们将逐一介绍这些分类标准的含义。

偏向锁/轻量级锁/重量级锁

第一种分类是偏向锁/轻量级锁/重量级锁,这三种锁特指synchronized锁的状态,通过在对象头中的mark word来表明锁的状态。

  • 偏向锁: 如果一把锁从始至都没有竞争,那么实际上没有必要上锁,只需打上标记即可。这就是偏向锁的思想。当一个对象初始化后,还没有任何线程尝试获取它的锁时,它就是可偏向的。当第一个线程尝试访问并获取锁时,它会该线程。如果后续尝试获取锁的线程是偏向锁的拥有者,那么它可以直接获得锁,开销很小,性能最佳。
  • 轻量级锁: JVM开发者发现,在许多情况下,synchronized中的代码是被多个线程交替执行的,而不是同时执行的。也就是说,并不存在实际的竞争,或者只有短时间的锁竞争。在这种情况下,使用完全互的重量级锁是没有必要的。轻量级锁是指当锁原本是偏向锁时,被另一个线程访问,说明存在竞争。此时,偏向锁会升级为轻量级锁,线程会通过自旋的方式尝试获取锁,而不会陷入阻塞。
  • 重量级锁: 重量级锁是互斥锁,它是利用操作系统的同步机制实现的,所以开销相对比较大。当多个线程直接有实际竞争,且锁竞争时间长的时候,轻量级锁不能满足需求,锁就会膨胀为重量级锁。重量级锁会让其他申请却拿不到锁的线程进入阻塞状态。
偏向锁/轻量级锁/重量级锁
偏向锁/轻量级锁/重量级锁

你可以发现锁升级的路径:无锁→偏向锁→轻量级锁→重量级锁。

综上所述,偏向锁性能最好,可以避免执行 CAS 操作。而轻量级锁利用自旋和 CAS 避免了重量级锁带来的线程阻塞和唤醒,性能中等。重量级锁则会把获取不到锁的线程阻塞,性能最差。

可重入锁/非可重入锁

可重入锁允许线程在已经持有锁的情况下再次获取同一把锁,而非可重入锁则要求线程在再次尝试获取锁之前先释放当前持有的锁。ReentrantLock 是一个典型的可重入锁,正如其名称所示,reentrant 意味着可重入,它是 Lock 接口的主要实现类。

可中断锁/不可中断锁

可中断锁和不可中断锁,Java 中的 synchronized 关键字修饰的锁是不可中断锁,一旦线程申请了锁,就必须等待获取锁才能执行其他逻辑。而 ReentrantLock 是一个典型的可中断锁,例如使用 lockInterruptibly 方法在获取锁的过程中,如果不再需要获取锁,线程可以在中断后执行其他任务,不需要一直傻等到获取到锁才离开。

共享锁/独占锁

共享锁指的是我们同一把锁可以被多个线程同时获得,而独占锁则只允许一个线程获取锁。读写锁是共享锁和独占锁概念的典型应用,其中读锁是共享锁,写锁是独占锁。读锁可以被多个线程同时持有,而写锁最多只能同时被一个线程持有。

公平锁/非公平锁

公平锁和非公平锁。公平锁的公平的含义在于如果线程现在拿不到这把锁,它们会进入等待队列排队,在等待队列里等待时间长的线程会优先拿到这把锁,有先来先得的意思。而非公平锁就不那么“完美”了,它会在某些情况下可能会忽略排队的线程,导致插队现象。

悲观锁/乐观锁

悲观锁,以及与它对应的乐观锁。悲观锁的概念是在获取资源之前,必须先拿到锁,以便达到“独占”的状态,从而防止其他线干扰,所以其他线程不能来影响我。而乐观锁则不要求在访问资源前获取锁,也不会锁定资源。相反,乐观锁利用 CAS(Compare and Swap原理,在不独占资源的情况下完成资源的修改。

自旋锁/非自旋锁

自旋锁的特点是,当线程无法立即获取锁时,并不直接陷入阻塞或者释放 CPU 资源,它会通过循环不断尝试获取锁这个过程被称为“自旋”。非自旋锁则没有自旋过程,如果无法获取锁,线程会直接放弃或执行其他处理逻辑,例如去排队、陷入阻塞等。

好了,本课时的内容就全部讲完了,下一课时我将会从悲观锁和乐观锁开始详细讲解这一系列的锁的具体概念和特点,下一课时见。

书籍推荐:
《Java编程思想》https://www.todocoder.com/pdf/java/002002.htmlopen in new window
《Java并发编程实战》https://www.todocoder.com/pdf/java/002004.htmlopen in new window