Java 并发集合与原子类并发编程解析

一、现代并发集合的演进与应用

1.1 ConcurrentHashMap的现代化特性

Java 8及以后版本对ConcurrentHashMap进行了重大改进:

  • CAS + synchronized锁优化:JDK 8中摒弃了分段锁机制,采用CAS和synchronized实现,锁粒度细化到链表头节点或红黑树根节点
  • 流式API支持:支持Stream API进行并行计算
  • Lambda表达式增强:提供computeIfAbsent等函数式API
// 使用Lambda表达式和函数式API简化代码
ConcurrentHashMap<String, List<String>> map = new ConcurrentHashMap<>();

// 线程安全地添加元素到嵌套列表
map.computeIfAbsent("key", k -> new CopyOnWriteArrayList<>()).add("value");

// 使用流式API并行处理数据
long count = map.values().parallelStream()
               .flatMap(Collection::stream)
               .filter(s -> s.startsWith("prefix"))
               .count();
 

1.2 并发队列的增强:TransferQueue与DelayQueue

Java 7引入了TransferQueue接口,LinkedTransferQueue实现了该接口,支持生产者直接将元素传递给消费者:

// 使用LinkedTransferQueue实现高效的生产者-消费者模式
TransferQueue<String> queue = new LinkedTransferQueue<>();

// 生产者尝试直接传递元素给等待的消费者
boolean transferred = queue.tryTransfer("message");

// 如果没有等待的消费者,则阻塞直到有消费者接收
queue.transfer("important message");
 
 

DelayQueue则支持元素按延迟时间排序,常用于定时任务调度:

// 使用DelayQueue实现定时任务
DelayQueue<DelayedTask> delayQueue = new DelayQueue<>();

// 添加延迟任务
delayQueue.put(new DelayedTask("task1", 5, TimeUnit.SECONDS));

// 消费者线程
new Thread(() -> {
   
    try {
   
        // 自动等待直到任务到期
        DelayedTask task = delayQueue.take();
        task.execute();
    } catch (InterruptedException e) {
   
        Thread.currentThread().interrupt();
    }
}).start();
 
 

二、原子类的扩展与应用

2.1 LongAdder与Striped64:高并发计数器

Java 8引入了LongAdderDoubleAdder等类,在高并发环境下性能显著优于AtomicLong:

// 高并发计数场景
LongAdder counter = new LongAdder();

// 多个线程同时递增计数
for (int i = 0; i < 10; i++) {
   
    new Thread(() -> {
   
        for (int j = 0; j < 1000; j++) {
   
            counter.increment();
        }
    }).start();
}

// 获取最终计数值
long sum = counter.sum();
 
 

LongAdder内部采用分段锁思想,将计数分散到多个Cell中,减少竞争,适合写多读少的场景。

2.2 VarHandle:直接内存访问

Java 9引入了VarHandle,提供比反射更高效的方式访问和修改字段:

// 使用VarHandle实现无锁算法
public class LockFreeStack<E> {
   
    private static class Node<E> {
   
        final E item;
        volatile Node<E> next;

        Node(E item) {
   
            this.item = item;
        }
    }

    private static final VarHandle NEXT;

    static {
   
        try {
   
            NEXT = MethodHandles.lookup().findVarHandle(Node.class, "next", Node.class);
        } catch (ReflectiveOperationException e) {
   
            throw new ExceptionInInitializerError(e);
        }
    }

    private volatile Node<E> head;

    public void push(E item) {
   
        Node<E> newHead = new Node<>(item);
        Node<E> oldHead;
        do {
   
            oldHead = head;
            newHead.next = oldHead;
        } while (!NEXT.compareAndSet(this, oldHead, newHead));
    }
}
 
 

三、响应式编程与并发集合的结合

Java 9引入了Flow API,支持响应式编程模型:

// 使用Flow API和并发集合实现响应式数据流
class DataProcessor implements Flow.Subscriber<Integer> {
   
    private Flow.Subscription subscription;
    private final ConcurrentLinkedQueue<Integer> buffer = new ConcurrentLinkedQueue<>();

    @Override
    public void onSubscribe(Flow.Subscription subscription) {
   
        this.subscription = subscription;
        subscription.request(1);
    }

    @Override
    public void onNext(Integer item) {
   
        buffer.add(item);
        // 处理数据
        processData();
        subscription.request(1);
    }

    private void processData() {
   
        // 使用并发集合安全地处理数据
        while (!buffer.isEmpty()) {
   
            Integer item = buffer.poll();
            // 处理逻辑
        }
    }
}
 
 

四、实战案例:高性能限流框架设计

下面是一个结合并发集合、原子类和响应式编程的高性能限流框架实现:

import java.time.Duration;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.LongAdder;
import java.util.function.Consumer;

/**
 * 高性能限流框架
 * 支持令牌桶和漏桶算法,基于并发集合和原子类实现
 */
public class RateLimiter {
   
    // 限流策略
    public enum Strategy {
   
        TOKEN_BUCKET, LEAKY_BUCKET
    }

    // 令牌桶实现
    private static class TokenBucket {
   
        private final long capacity;         // 桶容量
        private final long rate;             // 令牌生成速率(个/秒)
        private final AtomicLong lastRefillTime; // 上次填充令牌的时间
        private final AtomicLong availableTokens; // 当前可用令牌数

        public TokenBucket(long capacity, long rate) {
   
            this.capacity = capacity;
            this.rate = rate;
            this.lastRefillTime = new AtomicLong(System.nanoTime());
            this.availableTokens = new AtomicLong(capacity);
        }

        // 尝试获取令牌
        public boolean tryAcquire(int tokens) {
   
            refill();
            return availableTokens.getAndUpdate(
                current -> current >= tokens ? current - tokens : current) >= tokens;
        }

        // 填充令牌
        private void refill() {
   
            long now = System.nanoTime();
            long lastRefill = lastRefillTime.get();

            // 计算应该添加的令牌数
            long elapsedNanos = now - lastRefill;
            long newTokens = (elapsedNanos * rate) / 1_000_000_000L;

            if (newTokens > 0) {
   
                // 原子性地更新令牌数和时间
                lastRefillTime.compareAndSet(lastRefill, now);
                availableTokens.updateAndGet(
                    current -> Math.min(capacity, current + newTokens));
            }
        }
    }

    // 漏桶实现
    private static class LeakyBucket {
   
        private final long rate;             // 漏水速率(个/秒)
        private final long capacity;         // 桶容量
        private final ConcurrentLinkedQueue<Long> requests; // 请求队列
        private final ScheduledExecutorService scheduler;   // 调度器

        public LeakyBucket(long capacity, long rate) {
   
            this.rate = rate;
            this.capacity = capacity;
            this.requests = new ConcurrentLinkedQueue<>();

            // 创建调度器,定期处理请求
            this.scheduler = Executors.newSingleThreadScheduledExecutor();
            long interval = 1_000_000_000L / rate; // 纳秒
            scheduler.scheduleAtFixedRate(this::processRequests, 
                                          interval, interval, TimeUnit.NANOSECONDS);
        }

        // 尝试添加请求到桶中
        public boolean tryAddRequest() {
   
            if (requests.size() >= capacity) {
   
                return false;
            }
            requests.offer(System.nanoTime());
            return true;
        }

        // 处理请求
        private void processRequests() {
   
            requests.poll();
        }

        // 关闭资源
        public void shutdown() {
   
            scheduler.shutdown();
        }
    }

    // 限流统计
    private static class RateLimiterStats {
   
        private final LongAdder requests = new LongAdder();    // 请求总数
        private final LongAdder allowed = new LongAdder();     // 允许的请求数
        private final LongAdder blocked = new LongAdder();     // 被限流的请求数

        public void recordRequest() {
   
            requests.increment();
        }

        public void recordAllowed() {
   
            allowed.increment();
        }

        public void recordBlocked() {
   
            blocked.increment();
        }

        public double getBlockedRate() {
   
            long reqs = requests.sum();
            return reqs > 0 ? (double) blocked.sum() / reqs : 0.0;
        }
    }

    // 核心成员
    private final Strategy strategy;
    private final TokenBucket tokenBucket;
    private final LeakyBucket leakyBucket;
    private final RateLimiterStats stats;
    private final ConcurrentHashMap<String, Consumer<Object>> listeners;

    // 构造函数
    public RateLimiter(Strategy strategy, long capacity, long rate) {
   
        this.strategy = strategy;
        this.stats = new RateLimiterStats();
        this.listeners = new ConcurrentHashMap<>();

        if (strategy == Strategy.TOKEN_BUCKET) {
   
            this.tokenBucket = new TokenBucket(capacity, rate);
            this.leakyBucket = null;
        } else {
   
            this.leakyBucket = new LeakyBucket(capacity, rate);
            this.tokenBucket = null;
        }
    }

    // 尝试获取许可
    public boolean tryAcquire() {
   
        stats.recordRequest();
        boolean acquired;

        if (strategy == Strategy.TOKEN_BUCKET) {
   
            acquired = tokenBucket.tryAcquire(1);
        } else {
   
            acquired = leakyBucket.tryAddRequest();
        }

        if (acquired) {
   
            stats.recordAllowed();
            notifyListeners("allowed", null);
        } else {
   
            stats.recordBlocked();
            notifyListeners("blocked", null);
        }

        return acquired;
    }

    // 注册事件监听器
    public void registerListener(String eventType, Consumer<Object> listener) {
   
        listeners.put(eventType, listener);
    }

    // 通知监听器
    private void notifyListeners(String eventType, Object data) {
   
        Consumer<Object> listener = listeners.get(eventType);
        if (listener != null) {
   
            listener.accept(data);
        }
    }

    // 获取统计信息
    public Map<String, Object> getStats() {
   
        Map<String, Object> result = new HashMap<>();
        result.put("requests", stats.requests.sum());
        result.put("allowed", stats.allowed.sum());
        result.put("blocked", stats.blocked.sum());
        result.put("blockedRate", stats.getBlockedRate());
        return result;
    }

    // 关闭资源
    public void shutdown() {
   
        if (leakyBucket != null) {
   
            leakyBucket.shutdown();
        }
    }
}
 
 

这个限流框架结合了以下现代并发技术:

  1. 原子类优化:使用AtomicLongLongAdder实现高性能计数器
  2. 并发集合ConcurrentHashMap存储监听器,ConcurrentLinkedQueue实现漏桶算法
  3. 响应式设计:支持事件监听和通知机制
  4. 函数式编程:使用Lambda表达式和函数式接口简化代码

五、Java 17中的并发新特性

5.1 结构化并发(JEP 428)

Java 19/20引入的结构化并发特性允许将相关任务视为单个工作单元,简化错误处理和资源管理:

// 使用结构化并发处理多个相关任务
try (StructuredTaskScope.ShutdownOnFailure scope = new StructuredTaskScope.ShutdownOnFailure()) {
   
    // 提交两个并发任务
    Future<String> user = scope.fork(() -> fetchUser());
    Future<Integer> order = scope.fork(() -> fetchOrder());

    // 等待所有任务完成或任何任务失败
    scope.join().throwIfFailed();

    // 安全地组合结果
    return processResults(user.resultNow(), order.resultNow());
}
 
 

5.2 Vector API(JEP 417)

Java 16/17引入的Vector API支持高效的向量计算,在并行处理大数据集时性能显著提升:

// 使用Vector API进行并行向量计算
import jdk.incubator.vector.*;

public class VectorComputation {
   
    private static final VectorSpecies<Float> SPECIES = FloatVector.SPECIES_PREFERRED;

    public static float[] vectorAdd(float[] a, float[] b) {
   
        float[] result = new float[a.length];
        int i = 0;
        // 向量化处理主循环
        for (; i <= a.length - SPECIES.length(); i += SPECIES.length()) {
   
            FloatVector va = FloatVector.fromArray(SPECIES, a, i);
            FloatVector vb = FloatVector.fromArray(SPECIES, b, i);
            FloatVector vc = va.add(vb);
            vc.intoArray(result, i);
        }
        // 处理剩余元素
        for (; i < a.length; i++) {
   
            result[i] = a[i] + b[i];
        }
        return result;
    }
}
posted @ 2026-01-03 12:22  anpijj  阅读(1)  评论(0)    收藏  举报