CountDownLatch、CyclicBarrier区别
CountDownLatch:通常用在一个线程阻塞等待多个线程完成,比如说主线程等待子线程存储完成,在继续主线程汇总存储 CyclicBarrier:通常用在子线程阻塞等待其他子线程,比如跑完步等人去超市
ThreadLocal
通常用于存储线程隔离的数据,每个线程有个threadlocalMap,key是threadlocal对象,引用是weakreference,因为强引用的话,会导致引用处无法被清理,导致OOM。多线程使用InheritableThreadLocal,但是这个只会在主线程多线程创建的时候创建,因此其实线程池那边因为线程不会被销毁,其实不能用。需要使用阿里开源的TransmittableThreadLocal。
Threadlocal用处:存储token,存储线程隔离的数据。传递数据。存储traceId(平安的MDC就是基于threadlocal去存储的)
Arthas
trace 命令,用来追踪耗时的,注:无法多层函数里面多级追踪 arthas.aliyun.com/doc/trace.h…
分段锁
// 订单ID分段锁(16段)
public class SegmentLock {
private static final int SEGMENTS = 16;
private final RLock[] locks;
public SegmentLock(RedissonClient redisson) {
locks = new RLock[SEGMENTS];
for (int i = 0; i < SEGMENTS; i++) {
locks[i] = redisson.getLock("order_segment_" + i);
}
}
public RLock getLock(String orderId) {
int segment = Math.abs(orderId.hashCode()) % SEGMENTS;
return locks[segment];
}
}
// 使用示例
public void updateOrderStatus(String orderId, String status) {
RLock lock = segmentLock.getLock(orderId);
try {
lock.lock();
// 业务逻辑:更新订单状态
} finally {
lock.unlock();
}
}
推荐使用场景
1. 高并发写场景
例如notecode比如生成支付流水号,根据账户id分段。其他还得想有什么用。跟前面的队列能不能组合一下
2. 读多写少场景的优化
3. 不推荐使用场景
- 强一致性事务:需跨段原子操作时(如转账涉及两个段),分段锁无法保证。
- 段内高频冲突:若某段天然成为热点(如全局计数器),应改用无锁结构(如
LongAdder)。