返回

揭秘 Java 并发神器:Semaphore 源码剖析

见解分享

前言

在 Java 并发编程的浩瀚世界中,Semaphore 犹如一颗璀璨的明珠,以其独到的并发控制能力著称。今天,让我们踏上一段探索之旅,深入剖析 Semaphore 的源码,揭开其背后的运作机制。

Semaphore 的本质

Semaphore,直译为信号量,是一种同步机制,用来限制对共享资源的并发访问。它通过一个非负整数(称为许可证)来表示资源的可用性。当许可证数量为正时,表示资源可用;当许可证数量为零时,表示资源已被占用。

Semaphore 源码结构

Semaphore 位于 java.util.concurrent 包中,其源码结构主要分为三个内部类:

  • Sync :Semaphore 的非公平实现,即许可证的获取不会考虑请求的顺序。
  • NonfairSync :Semaphore 的公平实现,即许可证的获取会考虑请求的顺序,先请求的先获取。
  • FairSync :Semaphore 的公平实现,比 NonfairSync 效率稍低。

Sync 类

Sync 类是 Semaphore 的非公平实现。它包含以下字段属性:

  • state :Semaphore 的许可证数量。
  • queue :一个 FIFO 队列,用来存储等待获取许可证的线程。

Sync 类提供了以下构造方法:

  • Sync(int permits) :创建一个新的 Semaphore,初始化许可证数量为 permits。

Sync 类还提供了以下方法:

  • acquire() :获取一个许可证,如果许可证不足,则当前线程会阻塞。
  • release() :释放一个许可证。
  • hasQueuedThreads() :检查是否有线程正在等待获取许可证。

NonfairSync 类

NonfairSync 类是 Semaphore 的公平实现。它包含以下字段属性:

  • state :Semaphore 的许可证数量。
  • tail :指向等待队列尾部的节点。
  • head :指向等待队列头部的节点。

NonfairSync 类提供了以下构造方法:

  • NonfairSync(int permits) :创建一个新的 Semaphore,初始化许可证数量为 permits。

NonfairSync 类还提供了以下方法:

  • acquire() :获取一个许可证,如果许可证不足,则当前线程会阻塞。
  • release() :释放一个许可证。
  • hasQueuedThreads() :检查是否有线程正在等待获取许可证。

FairSync 类

FairSync 类是 Semaphore 的公平实现,其效率稍低于 NonfairSync 类。它包含以下字段属性:

  • state :Semaphore 的许可证数量。
  • tail :指向等待队列尾部的节点。
  • head :指向等待队列头部的节点。

FairSync 类提供了以下构造方法:

  • FairSync(int permits) :创建一个新的 Semaphore,初始化许可证数量为 permits。

FairSync 类还提供了以下方法:

  • acquire() :获取一个许可证,如果许可证不足,则当前线程会阻塞。
  • release() :释放一个许可证。
  • hasQueuedThreads() :检查是否有线程正在等待获取许可证。

结语

Semaphore 的源码分析是一趟深入 Java 并发编程核心的旅程。通过剖析 Sync、NonfairSync 和 FairSync 类的实现,我们了解了 Semaphore 如何通过许可证机制来控制并发访问。这些知识对于掌握 Java 并发编程至关重要,它使我们能够构建高性能、可伸缩的并发应用程序。