Module bus.core

Class SegmentLock<L>

java.lang.Object
org.miaixz.bus.core.lang.thread.lock.SegmentLock<L>
Type Parameters:
L -

public abstract class SegmentLock<L> extends Object
分段锁工具类,支持 Lock、Semaphore 和 ReadWriteLock 的分段实现。

通过将锁分成多个段(segments),不同的操作可以并发使用不同的段,避免所有线程竞争同一把锁。 相等的 key 保证映射到同一段锁(如 key1.equals(key2) 时,get(key1) 和 get(key2) 返回相同对象)。 但不同 key 可能因哈希冲突映射到同一段,段数越少冲突概率越高。

支持两种实现:

  • 强引用:创建时初始化所有段,内存占用稳定。
  • 弱引用:懒加载,首次使用时创建段,未使用时可被垃圾回收,适合大量段但使用较少的场景。
Since:
Java 17+
Author:
Kimi Liu
  • Constructor Details

    • SegmentLock

      public SegmentLock()
  • Method Details

    • get

      public abstract L get(Object key)
      根据 key 获取对应的锁段,保证相同 key 返回相同对象。
      Parameters:
      key - 非空 key
      Returns:
      对应的锁段
    • getAt

      public abstract L getAt(int index)
      根据索引获取锁段,索引范围为 [0, size())。
      Parameters:
      index - 索引
      Returns:
      指定索引的锁段
    • size

      public abstract int size()
      获取总段数。
      Returns:
      段数
    • bulkGet

      public Iterable<L> bulkGet(Iterable<?> keys)
      批量获取多个 key 对应的锁段列表,按索引升序排列,避免死锁。
      Parameters:
      keys - 非空 key 集合
      Returns:
      锁段列表(可能有重复)
    • custom

      public static <L> SegmentLock<L> custom(int stripes, Supplier<L> supplier)
      创建强引用的分段锁,所有段在创建时初始化。
      Type Parameters:
      L - 锁类型
      Parameters:
      stripes - 段数
      supplier - 锁提供者
      Returns:
      分段锁实例
    • lock

      public static SegmentLock<Lock> lock(int stripes)
      创建强引用的可重入锁分段实例。
      Parameters:
      stripes - 段数
      Returns:
      分段锁实例
    • lazyWeakLock

      public static SegmentLock<Lock> lazyWeakLock(int stripes)
      创建弱引用的可重入锁分段实例,懒加载。
      Parameters:
      stripes - 段数
      Returns:
      分段锁实例
    • semaphore

      public static SegmentLock<Semaphore> semaphore(int stripes, int permits)
      创建强引用的信号量分段实例。
      Parameters:
      stripes - 段数
      permits - 每个信号量的许可数
      Returns:
      分段信号量实例
    • lazyWeakSemaphore

      public static SegmentLock<Semaphore> lazyWeakSemaphore(int stripes, int permits)
      创建弱引用的信号量分段实例,懒加载。
      Parameters:
      stripes - 段数
      permits - 每个信号量的许可数
      Returns:
      分段信号量实例
    • readWriteLock

      public static SegmentLock<ReadWriteLock> readWriteLock(int stripes)
      创建强引用的读写锁分段实例。
      Parameters:
      stripes - 段数
      Returns:
      分段读写锁实例
    • lazyWeakReadWriteLock

      public static SegmentLock<ReadWriteLock> lazyWeakReadWriteLock(int stripes)
      创建弱引用的读写锁分段实例,懒加载。
      Parameters:
      stripes - 段数
      Returns:
      分段读写锁实例