L
- 锁类型public abstract class SegmentLock<L> extends Object
通过将锁分成多个段(segments),不同的操作可以并发使用不同的段,避免所有线程竞争同一把锁。 相等的 key 保证映射到同一段锁(如 key1.equals(key2) 时,get(key1) 和 get(key2) 返回相同对象)。 但不同 key 可能因哈希冲突映射到同一段,段数越少冲突概率越高。
支持两种实现:
Modifier and Type | Method and Description |
---|---|
Iterable<L> |
bulkGet(Iterable<?> keys)
批量获取多个 key 对应的锁段列表,按索引升序排列,避免死锁。
|
static <L> SegmentLock<L> |
custom(int stripes,
Supplier<L> supplier)
创建强引用的分段锁,所有段在创建时初始化。
|
abstract L |
get(Object key)
根据 key 获取对应的锁段,保证相同 key 返回相同对象。
|
abstract L |
getAt(int index)
根据索引获取锁段,索引范围为 [0, size())。
|
static SegmentLock<Lock> |
lazyWeakLock(int stripes)
创建弱引用的可重入锁分段实例,懒加载。
|
static SegmentLock<ReadWriteLock> |
lazyWeakReadWriteLock(int stripes)
创建弱引用的读写锁分段实例,懒加载。
|
static SegmentLock<Semaphore> |
lazyWeakSemaphore(int stripes,
int permits)
创建弱引用的信号量分段实例,懒加载。
|
static SegmentLock<Lock> |
lock(int stripes)
创建强引用的可重入锁分段实例。
|
static SegmentLock<ReadWriteLock> |
readWriteLock(int stripes)
创建强引用的读写锁分段实例。
|
static SegmentLock<Semaphore> |
semaphore(int stripes,
int permits)
创建强引用的信号量分段实例。
|
abstract int |
size()
获取总段数。
|
public abstract L get(Object key)
key
- 非空 keypublic abstract L getAt(int index)
index
- 索引public abstract int size()
public Iterable<L> bulkGet(Iterable<?> keys)
keys
- 非空 key 集合public static <L> SegmentLock<L> custom(int stripes, Supplier<L> supplier)
L
- 锁类型stripes
- 段数supplier
- 锁提供者public static SegmentLock<Lock> lock(int stripes)
stripes
- 段数public static SegmentLock<Lock> lazyWeakLock(int stripes)
stripes
- 段数public static SegmentLock<Semaphore> semaphore(int stripes, int permits)
stripes
- 段数permits
- 每个信号量的许可数public static SegmentLock<Semaphore> lazyWeakSemaphore(int stripes, int permits)
stripes
- 段数permits
- 每个信号量的许可数public static SegmentLock<ReadWriteLock> readWriteLock(int stripes)
stripes
- 段数public static SegmentLock<ReadWriteLock> lazyWeakReadWriteLock(int stripes)
stripes
- 段数Copyright © 2025. All rights reserved.