CountDownLatch、CyclicBarrier、ThreadLocal、trace命令

39 阅读2分钟

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)。