🧵⚡ 并发与多线程优化:让程序"多手"协作更高效

18 阅读13分钟

"并发优化就像指挥交响乐团,每个乐手都要协调配合,才能演奏出美妙的音乐!" 🎼🎵

🎯 什么是并发与多线程优化?

想象一下,你是一个超级忙碌的餐厅经理 🍽️。每天都有很多客人来用餐,如果你只用一个服务员,那效率太低了!

并发与多线程优化就像是学会最聪明的员工管理方法,让多个服务员同时工作,提高整体效率!

🏃‍♂️ 核心思想:用多线程换并行处理,用优化换性能

未优化:单线程处理 → 串行执行 → 效率低下
已优化:多线程处理 → 并行执行 → 效率提升

效率提升:2-8倍! 🎉

🎨 并发与多线程优化的四种策略

1. 线程管理 - 让线程"工作"更有序 👥

生活比喻: 就像管理员工,从招聘到培训,从分配到监督,每个环节都要精心安排!

@Service
public class ThreadManagementService {
    
    // 线程池优化
    public static class OptimizedThreadPool {
        private final ThreadPoolExecutor executorService;
        private final ScheduledExecutorService scheduledExecutorService;
        private final ForkJoinPool forkJoinPool;
        
        public OptimizedThreadPool() {
            // 核心线程数 = CPU核心数
            int corePoolSize = Runtime.getRuntime().availableProcessors();
            // 最大线程数 = CPU核心数 * 2
            int maxPoolSize = corePoolSize * 2;
            // 线程空闲时间
            long keepAliveTime = 60L;
            
            this.executorService = new ThreadPoolExecutor(
                corePoolSize,
                maxPoolSize,
                keepAliveTime,
                TimeUnit.SECONDS,
                new LinkedBlockingQueue<>(1000),
                new ThreadFactory() {
                    private final AtomicInteger threadNumber = new AtomicInteger(1);
                    @Override
                    public Thread newThread(Runnable r) {
                        Thread t = new Thread(r, "optimized-pool-" + threadNumber.getAndIncrement());
                        t.setDaemon(true);
                        t.setPriority(Thread.NORM_PRIORITY);
                        return t;
                    }
                },
                new ThreadPoolExecutor.CallerRunsPolicy()
            );
            
            this.scheduledExecutorService = Executors.newScheduledThreadPool(2);
            this.forkJoinPool = new ForkJoinPool(corePoolSize);
        }
        
        public void execute(Runnable task) {
            executorService.execute(task);
        }
        
        public Future<?> submit(Runnable task) {
            return executorService.submit(task);
        }
        
        public <T> Future<T> submit(Callable<T> task) {
            return executorService.submit(task);
        }
        
        public ScheduledFuture<?> schedule(Runnable task, long delay, TimeUnit unit) {
            return scheduledExecutorService.schedule(task, delay, unit);
        }
        
        public <T> T invoke(ForkJoinTask<T> task) {
            return forkJoinPool.invoke(task);
        }
        
        public void shutdown() {
            executorService.shutdown();
            scheduledExecutorService.shutdown();
            forkJoinPool.shutdown();
        }
    }
    
    // 任务队列选择
    public static class TaskQueueSelector {
        
        // 有界队列 - 适合CPU密集型任务
        public BlockingQueue<Runnable> createBoundedQueue(int capacity) {
            return new ArrayBlockingQueue<>(capacity);
        }
        
        // 无界队列 - 适合IO密集型任务
        public BlockingQueue<Runnable> createUnboundedQueue() {
            return new LinkedBlockingQueue<>();
        }
        
        // 同步队列 - 适合需要立即执行的任务
        public BlockingQueue<Runnable> createSynchronousQueue() {
            return new SynchronousQueue<>();
        }
        
        // 优先级队列 - 适合有优先级要求的任务
        public BlockingQueue<Runnable> createPriorityQueue() {
            return new PriorityBlockingQueue<>();
        }
    }
    
    // 拒绝策略设计
    public static class RejectionPolicyDesigner {
        
        // 自定义拒绝策略
        public static class CustomRejectionPolicy implements RejectedExecutionHandler {
            private final AtomicInteger rejectedCount = new AtomicInteger(0);
            
            @Override
            public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
                rejectedCount.incrementAndGet();
                log.warn("任务被拒绝,当前拒绝次数: {}", rejectedCount.get());
                
                // 尝试重新提交
                if (!executor.isShutdown()) {
                    try {
                        executor.getQueue().offer(r, 100, TimeUnit.MILLISECONDS);
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                        log.error("重新提交任务失败", e);
                    }
                }
            }
            
            public int getRejectedCount() {
                return rejectedCount.get();
            }
        }
        
        // 监控拒绝策略
        public static class MonitoringRejectionPolicy implements RejectedExecutionHandler {
            private final MeterRegistry meterRegistry;
            private final Counter rejectionCounter;
            
            public MonitoringRejectionPolicy(MeterRegistry meterRegistry) {
                this.meterRegistry = meterRegistry;
                this.rejectionCounter = Counter.builder("threadpool.rejection.count")
                        .register(meterRegistry);
            }
            
            @Override
            public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
                rejectionCounter.increment();
                log.warn("任务被拒绝,线程池状态: 活跃线程={}, 队列大小={}", 
                    executor.getActiveCount(), executor.getQueue().size());
            }
        }
    }
    
    // 监控与调优
    public static class ThreadPoolMonitor {
        private final ThreadPoolExecutor executor;
        private final ScheduledExecutorService monitorExecutor;
        
        public ThreadPoolMonitor(ThreadPoolExecutor executor) {
            this.executor = executor;
            this.monitorExecutor = Executors.newSingleThreadScheduledExecutor();
            
            // 定期监控线程池状态
            monitorExecutor.scheduleAtFixedRate(this::monitorThreadPool, 0, 5, TimeUnit.SECONDS);
        }
        
        private void monitorThreadPool() {
            log.info("线程池状态: 核心线程数={}, 活跃线程数={}, 最大线程数={}, 队列大小={}", 
                executor.getCorePoolSize(),
                executor.getActiveCount(),
                executor.getMaximumPoolSize(),
                executor.getQueue().size());
            
            // 动态调整线程池大小
            adjustThreadPoolSize();
        }
        
        private void adjustThreadPoolSize() {
            int activeCount = executor.getActiveCount();
            int corePoolSize = executor.getCorePoolSize();
            int maxPoolSize = executor.getMaximumPoolSize();
            
            // 如果活跃线程数接近最大线程数,增加核心线程数
            if (activeCount > maxPoolSize * 0.8) {
                int newCorePoolSize = Math.min(corePoolSize + 2, maxPoolSize);
                executor.setCorePoolSize(newCorePoolSize);
                log.info("增加核心线程数到: {}", newCorePoolSize);
            }
            // 如果活跃线程数很少,减少核心线程数
            else if (activeCount < corePoolSize * 0.3) {
                int newCorePoolSize = Math.max(corePoolSize - 1, 1);
                executor.setCorePoolSize(newCorePoolSize);
                log.info("减少核心线程数到: {}", newCorePoolSize);
            }
        }
        
        public void shutdown() {
            monitorExecutor.shutdown();
        }
    }
}

2. 线程同步优化 - 让线程"协作"更和谐 🤝

生活比喻: 就像交通信号灯,让车辆有序通过,避免拥堵和事故!

@Service
public class ThreadSynchronizationOptimizationService {
    
    // 锁粒度控制
    public static class LockGranularityController {
        
        // 细粒度锁 - 提高并发性
        private final Map<String, Object> locks = new ConcurrentHashMap<>();
        private final Map<String, String> data = new ConcurrentHashMap<>();
        
        public void updateData(String key, String value) {
            Object lock = locks.computeIfAbsent(key, k -> new Object());
            synchronized (lock) {
                data.put(key, value);
            }
        }
        
        public String getData(String key) {
            Object lock = locks.get(key);
            if (lock != null) {
                synchronized (lock) {
                    return data.get(key);
                }
            }
            return null;
        }
        
        // 粗粒度锁 - 简单但并发性低
        private final Object globalLock = new Object();
        private final Map<String, String> globalData = new HashMap<>();
        
        public void updateGlobalData(String key, String value) {
            synchronized (globalLock) {
                globalData.put(key, value);
            }
        }
        
        public String getGlobalData(String key) {
            synchronized (globalLock) {
                return globalData.get(key);
            }
        }
    }
    
    // 读写锁使用
    public static class ReadWriteLockOptimizer {
        private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
        private final Map<String, String> data = new HashMap<>();
        
        public String read(String key) {
            lock.readLock().lock();
            try {
                return data.get(key);
            } finally {
                lock.readLock().unlock();
            }
        }
        
        public void write(String key, String value) {
            lock.writeLock().lock();
            try {
                data.put(key, value);
            } finally {
                lock.writeLock().unlock();
            }
        }
        
        // 读写锁升级
        public String readAndUpdate(String key, String newValue) {
            lock.readLock().lock();
            try {
                String currentValue = data.get(key);
                if (currentValue != null) {
                    // 升级为写锁
                    lock.readLock().unlock();
                    lock.writeLock().lock();
                    try {
                        // 双重检查
                        currentValue = data.get(key);
                        if (currentValue != null) {
                            data.put(key, newValue);
                        }
                        return currentValue;
                    } finally {
                        lock.readLock().lock(); // 降级为读锁
                        lock.writeLock().unlock();
                    }
                }
                return null;
            } finally {
                lock.readLock().unlock();
            }
        }
    }
    
    // 无锁编程
    public static class LockFreeProgramming {
        
        // CAS操作优化
        private final AtomicInteger counter = new AtomicInteger(0);
        private final AtomicReference<String> value = new AtomicReference<>();
        
        public int increment() {
            return counter.incrementAndGet();
        }
        
        public int decrement() {
            return counter.decrementAndGet();
        }
        
        public boolean compareAndSet(String expected, String update) {
            return value.compareAndSet(expected, update);
        }
        
        // 无锁栈
        public static class LockFreeStack<T> {
            private final AtomicReference<Node<T>> head = new AtomicReference<>();
            
            public void push(T value) {
                Node<T> newNode = new Node<>(value);
                Node<T> currentHead;
                do {
                    currentHead = head.get();
                    newNode.next = currentHead;
                } while (!head.compareAndSet(currentHead, newNode));
            }
            
            public T pop() {
                Node<T> currentHead;
                Node<T> newHead;
                do {
                    currentHead = head.get();
                    if (currentHead == null) {
                        return null;
                    }
                    newHead = currentHead.next;
                } while (!head.compareAndSet(currentHead, newHead));
                
                return currentHead.value;
            }
            
            private static class Node<T> {
                final T value;
                Node<T> next;
                
                Node(T value) {
                    this.value = value;
                }
            }
        }
        
        // 无锁队列
        public static class LockFreeQueue<T> {
            private final AtomicReference<Node<T>> head = new AtomicReference<>();
            private final AtomicReference<Node<T>> tail = new AtomicReference<>();
            
            public LockFreeQueue() {
                Node<T> dummy = new Node<>(null);
                head.set(dummy);
                tail.set(dummy);
            }
            
            public void enqueue(T value) {
                Node<T> newNode = new Node<>(value);
                Node<T> currentTail;
                Node<T> currentTailNext;
                
                while (true) {
                    currentTail = tail.get();
                    currentTailNext = currentTail.next;
                    
                    if (currentTail == tail.get()) {
                        if (currentTailNext == null) {
                            if (currentTail.next.compareAndSet(null, newNode)) {
                                break;
                            }
                        } else {
                            tail.compareAndSet(currentTail, currentTailNext);
                        }
                    }
                }
                
                tail.compareAndSet(currentTail, newNode);
            }
            
            public T dequeue() {
                Node<T> currentHead;
                Node<T> currentTail;
                Node<T> currentHeadNext;
                T value;
                
                while (true) {
                    currentHead = head.get();
                    currentTail = tail.get();
                    currentHeadNext = currentHead.next;
                    
                    if (currentHead == head.get()) {
                        if (currentHead == currentTail) {
                            if (currentHeadNext == null) {
                                return null;
                            }
                            tail.compareAndSet(currentTail, currentHeadNext);
                        } else {
                            if (currentHeadNext == null) {
                                continue;
                            }
                            value = currentHeadNext.value;
                            if (head.compareAndSet(currentHead, currentHeadNext)) {
                                break;
                            }
                        }
                    }
                }
                
                return value;
            }
            
            private static class Node<T> {
                final T value;
                final AtomicReference<Node<T>> next = new AtomicReference<>();
                
                Node(T value) {
                    this.value = value;
                }
            }
        }
    }
    
    // CAS操作优化
    public static class CASOperationOptimizer {
        
        // 原子操作优化
        private final AtomicLong counter = new AtomicLong(0);
        private final AtomicReferenceArray<String> array = new AtomicReferenceArray<>(100);
        
        public long incrementCounter() {
            return counter.incrementAndGet();
        }
        
        public long decrementCounter() {
            return counter.decrementAndGet();
        }
        
        public long addToCounter(long delta) {
            return counter.addAndGet(delta);
        }
        
        public boolean setArrayElement(int index, String expected, String update) {
            return array.compareAndSet(index, expected, update);
        }
        
        // 原子字段更新
        public static class AtomicFieldUpdater {
            private volatile int value;
            private static final AtomicIntegerFieldUpdater<AtomicFieldUpdater> updater =
                AtomicIntegerFieldUpdater.newUpdater(AtomicFieldUpdater.class, "value");
            
            public int getValue() {
                return value;
            }
            
            public boolean compareAndSet(int expected, int update) {
                return updater.compareAndSet(this, expected, update);
            }
            
            public int incrementAndGet() {
                return updater.incrementAndGet(this);
            }
        }
    }
}

3. 线程通信优化 - 让线程"交流"更顺畅 💬

生活比喻: 就像团队沟通,用对了沟通方式,信息传递更高效!

@Service
public class ThreadCommunicationOptimizationService {
    
    // 消息队列
    public static class MessageQueueOptimizer {
        private final BlockingQueue<Message> messageQueue;
        private final ExecutorService consumerExecutor;
        private final AtomicBoolean running = new AtomicBoolean(true);
        
        public MessageQueueOptimizer(int queueSize, int consumerThreads) {
            this.messageQueue = new ArrayBlockingQueue<>(queueSize);
            this.consumerExecutor = Executors.newFixedThreadPool(consumerThreads);
            
            // 启动消费者线程
            for (int i = 0; i < consumerThreads; i++) {
                consumerExecutor.submit(new MessageConsumer());
            }
        }
        
        public boolean sendMessage(Message message) {
            try {
                return messageQueue.offer(message, 100, TimeUnit.MILLISECONDS);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                return false;
            }
        }
        
        private class MessageConsumer implements Runnable {
            @Override
            public void run() {
                while (running.get()) {
                    try {
                        Message message = messageQueue.poll(1, TimeUnit.SECONDS);
                        if (message != null) {
                            processMessage(message);
                        }
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                        break;
                    }
                }
            }
            
            private void processMessage(Message message) {
                // 处理消息
                log.info("处理消息: {}", message.getContent());
            }
        }
        
        public void shutdown() {
            running.set(false);
            consumerExecutor.shutdown();
        }
        
        private static class Message {
            private final String content;
            private final long timestamp;
            
            Message(String content) {
                this.content = content;
                this.timestamp = System.currentTimeMillis();
            }
            
            String getContent() {
                return content;
            }
            
            long getTimestamp() {
                return timestamp;
            }
        }
    }
    
    // 管道通信
    public static class PipeCommunicationOptimizer {
        private final PipedInputStream inputStream;
        private final PipedOutputStream outputStream;
        private final ExecutorService executor;
        
        public PipeCommunicationOptimizer() throws IOException {
            this.inputStream = new PipedInputStream();
            this.outputStream = new PipedOutputStream(inputStream);
            this.executor = Executors.newFixedThreadPool(2);
        }
        
        public void startCommunication() {
            // 启动生产者
            executor.submit(new Producer());
            
            // 启动消费者
            executor.submit(new Consumer());
        }
        
        private class Producer implements Runnable {
            @Override
            public void run() {
                try {
                    for (int i = 0; i < 10; i++) {
                        String data = "Data " + i;
                        outputStream.write(data.getBytes());
                        outputStream.flush();
                        Thread.sleep(100);
                    }
                    outputStream.close();
                } catch (IOException | InterruptedException e) {
                    log.error("生产者异常", e);
                }
            }
        }
        
        private class Consumer implements Runnable {
            @Override
            public void run() {
                try {
                    byte[] buffer = new byte[1024];
                    int bytesRead;
                    while ((bytesRead = inputStream.read(buffer)) != -1) {
                        String data = new String(buffer, 0, bytesRead);
                        log.info("接收到数据: {}", data);
                    }
                    inputStream.close();
                } catch (IOException e) {
                    log.error("消费者异常", e);
                }
            }
        }
        
        public void shutdown() {
            executor.shutdown();
        }
    }
    
    // 信号量使用
    public static class SemaphoreOptimizer {
        private final Semaphore semaphore;
        private final AtomicInteger activeCount = new AtomicInteger(0);
        
        public SemaphoreOptimizer(int permits) {
            this.semaphore = new Semaphore(permits);
        }
        
        public void executeTask(Runnable task) {
            try {
                semaphore.acquire();
                activeCount.incrementAndGet();
                try {
                    task.run();
                } finally {
                    activeCount.decrementAndGet();
                    semaphore.release();
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                log.error("获取信号量失败", e);
            }
        }
        
        public int getActiveCount() {
            return activeCount.get();
        }
        
        public int getAvailablePermits() {
            return semaphore.availablePermits();
        }
    }
    
    // 条件变量
    public static class ConditionVariableOptimizer {
        private final ReentrantLock lock = new ReentrantLock();
        private final Condition condition = lock.newCondition();
        private final AtomicBoolean ready = new AtomicBoolean(false);
        
        public void waitForCondition() {
            lock.lock();
            try {
                while (!ready.get()) {
                    condition.await();
                }
                log.info("条件满足,继续执行");
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                log.error("等待条件失败", e);
            } finally {
                lock.unlock();
            }
        }
        
        public void signalCondition() {
            lock.lock();
            try {
                ready.set(true);
                condition.signalAll();
                log.info("条件已满足,通知等待线程");
            } finally {
                lock.unlock();
            }
        }
        
        public void resetCondition() {
            lock.lock();
            try {
                ready.set(false);
            } finally {
                lock.unlock();
            }
        }
    }
}

4. 并发数据结构 - 让数据"并发"更安全 🔒

生活比喻: 就像银行金库,多个人同时存取,但数据绝对安全!

@Service
public class ConcurrentDataStructureService {
    
    // 无锁数据结构
    public static class LockFreeDataStructures {
        
        // Lock-Free算法
        public static class LockFreeAlgorithm {
            private final AtomicReference<Node> head = new AtomicReference<>();
            
            public void add(int value) {
                Node newNode = new Node(value);
                Node currentHead;
                do {
                    currentHead = head.get();
                    newNode.next = currentHead;
                } while (!head.compareAndSet(currentHead, newNode));
            }
            
            public boolean contains(int value) {
                Node current = head.get();
                while (current != null) {
                    if (current.value == value) {
                        return true;
                    }
                    current = current.next;
                }
                return false;
            }
            
            private static class Node {
                final int value;
                volatile Node next;
                
                Node(int value) {
                    this.value = value;
                }
            }
        }
        
        // Wait-Free算法
        public static class WaitFreeAlgorithm {
            private final AtomicInteger counter = new AtomicInteger(0);
            private final AtomicReferenceArray<Integer> array = new AtomicReferenceArray<>(1000);
            
            public void increment() {
                int index = counter.getAndIncrement() % array.length();
                array.set(index, counter.get());
            }
            
            public int getValue(int index) {
                return array.get(index);
            }
        }
        
        // 原子操作
        public static class AtomicOperations {
            private final AtomicLong counter = new AtomicLong(0);
            private final AtomicReference<String> value = new AtomicReference<>();
            
            public long increment() {
                return counter.incrementAndGet();
            }
            
            public long decrement() {
                return counter.decrementAndGet();
            }
            
            public boolean compareAndSet(String expected, String update) {
                return value.compareAndSet(expected, update);
            }
            
            public String getValue() {
                return value.get();
            }
        }
        
        // 内存屏障
        public static class MemoryBarrier {
            private volatile int value;
            private volatile boolean ready;
            
            public void setValue(int value) {
                this.value = value;
                // 写屏障,确保value的写入在ready的写入之前完成
                this.ready = true;
            }
            
            public int getValue() {
                if (ready) {
                    // 读屏障,确保ready的读取在value的读取之前完成
                    return value;
                }
                return 0;
            }
        }
    }
    
    // 并发容器
    public static class ConcurrentContainers {
        
        // ConcurrentHashMap优化
        public static class ConcurrentHashMapOptimizer {
            private final ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>();
            
            public void put(String key, String value) {
                map.put(key, value);
            }
            
            public String get(String key) {
                return map.get(key);
            }
            
            public String computeIfAbsent(String key, Function<String, String> mappingFunction) {
                return map.computeIfAbsent(key, mappingFunction);
            }
            
            public void forEach(BiConsumer<String, String> action) {
                map.forEach(action);
            }
            
            // 批量操作
            public void putAll(Map<String, String> otherMap) {
                otherMap.forEach(map::put);
            }
            
            // 原子操作
            public String putIfAbsent(String key, String value) {
                return map.putIfAbsent(key, value);
            }
            
            public boolean remove(String key, String value) {
                return map.remove(key, value);
            }
            
            public String replace(String key, String value) {
                return map.replace(key, value);
            }
        }
        
        // ConcurrentLinkedQueue优化
        public static class ConcurrentLinkedQueueOptimizer {
            private final ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<>();
            
            public boolean offer(String item) {
                return queue.offer(item);
            }
            
            public String poll() {
                return queue.poll();
            }
            
            public String peek() {
                return queue.peek();
            }
            
            public boolean isEmpty() {
                return queue.isEmpty();
            }
            
            public int size() {
                return queue.size();
            }
            
            // 批量操作
            public void addAll(Collection<String> items) {
                queue.addAll(items);
            }
            
            public List<String> drainTo(int maxElements) {
                List<String> result = new ArrayList<>();
                String item;
                int count = 0;
                while (count < maxElements && (item = queue.poll()) != null) {
                    result.add(item);
                    count++;
                }
                return result;
            }
        }
        
        // CopyOnWriteArrayList优化
        public static class CopyOnWriteArrayListOptimizer {
            private final CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
            
            public void add(String item) {
                list.add(item);
            }
            
            public String get(int index) {
                return list.get(index);
            }
            
            public boolean remove(String item) {
                return list.remove(item);
            }
            
            public int size() {
                return list.size();
            }
            
            public void forEach(Consumer<String> action) {
                list.forEach(action);
            }
            
            // 批量操作
            public void addAll(Collection<String> items) {
                list.addAll(items);
            }
            
            public List<String> subList(int fromIndex, int toIndex) {
                return list.subList(fromIndex, toIndex);
            }
        }
        
        // BlockingQueue优化
        public static class BlockingQueueOptimizer {
            private final BlockingQueue<String> queue = new ArrayBlockingQueue<>(1000);
            
            public boolean offer(String item) {
                return queue.offer(item);
            }
            
            public boolean offer(String item, long timeout, TimeUnit unit) throws InterruptedException {
                return queue.offer(item, timeout, unit);
            }
            
            public String poll() {
                return queue.poll();
            }
            
            public String poll(long timeout, TimeUnit unit) throws InterruptedException {
                return queue.poll(timeout, unit);
            }
            
            public String take() throws InterruptedException {
                return queue.take();
            }
            
            public void put(String item) throws InterruptedException {
                queue.put(item);
            }
            
            public int remainingCapacity() {
                return queue.remainingCapacity();
            }
        }
    }
    
    // 并发模式
    public static class ConcurrentPatterns {
        
        // Producer-Consumer模式
        public static class ProducerConsumerPattern {
            private final BlockingQueue<String> queue = new ArrayBlockingQueue<>(100);
            private final ExecutorService executor = Executors.newFixedThreadPool(4);
            private final AtomicBoolean running = new AtomicBoolean(true);
            
            public void start() {
                // 启动生产者
                executor.submit(new Producer());
                executor.submit(new Producer());
                
                // 启动消费者
                executor.submit(new Consumer());
                executor.submit(new Consumer());
            }
            
            private class Producer implements Runnable {
                @Override
                public void run() {
                    int count = 0;
                    while (running.get()) {
                        try {
                            String item = "Item-" + count++;
                            queue.put(item);
                            log.info("生产者生产: {}", item);
                            Thread.sleep(100);
                        } catch (InterruptedException e) {
                            Thread.currentThread().interrupt();
                            break;
                        }
                    }
                }
            }
            
            private class Consumer implements Runnable {
                @Override
                public void run() {
                    while (running.get()) {
                        try {
                            String item = queue.take();
                            log.info("消费者消费: {}", item);
                            Thread.sleep(150);
                        } catch (InterruptedException e) {
                            Thread.currentThread().interrupt();
                            break;
                        }
                    }
                }
            }
            
            public void shutdown() {
                running.set(false);
                executor.shutdown();
            }
        }
        
        // Master-Worker模式
        public static class MasterWorkerPattern {
            private final ExecutorService masterExecutor = Executors.newSingleThreadExecutor();
            private final ExecutorService workerExecutor = Executors.newFixedThreadPool(4);
            private final BlockingQueue<Task> taskQueue = new LinkedBlockingQueue<>();
            private final BlockingQueue<Result> resultQueue = new LinkedBlockingQueue<>();
            private final AtomicBoolean running = new AtomicBoolean(true);
            
            public void start() {
                // 启动Master
                masterExecutor.submit(new Master());
                
                // 启动Workers
                for (int i = 0; i < 4; i++) {
                    workerExecutor.submit(new Worker(i));
                }
            }
            
            private class Master implements Runnable {
                @Override
                public void run() {
                    int taskId = 0;
                    while (running.get()) {
                        try {
                            Task task = new Task(taskId++, "Task-" + taskId);
                            taskQueue.put(task);
                            log.info("Master分配任务: {}", task);
                            Thread.sleep(200);
                        } catch (InterruptedException e) {
                            Thread.currentThread().interrupt();
                            break;
                        }
                    }
                }
            }
            
            private class Worker implements Runnable {
                private final int workerId;
                
                Worker(int workerId) {
                    this.workerId = workerId;
                }
                
                @Override
                public void run() {
                    while (running.get()) {
                        try {
                            Task task = taskQueue.poll(1, TimeUnit.SECONDS);
                            if (task != null) {
                                Result result = processTask(task);
                                resultQueue.put(result);
                                log.info("Worker-{}处理任务: {}, 结果: {}", workerId, task, result);
                            }
                        } catch (InterruptedException e) {
                            Thread.currentThread().interrupt();
                            break;
                        }
                    }
                }
                
                private Result processTask(Task task) {
                    // 模拟任务处理
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                    }
                    return new Result(task.getId(), "Result-" + task.getId());
                }
            }
            
            public void shutdown() {
                running.set(false);
                masterExecutor.shutdown();
                workerExecutor.shutdown();
            }
            
            private static class Task {
                private final int id;
                private final String name;
                
                Task(int id, String name) {
                    this.id = id;
                    this.name = name;
                }
                
                int getId() { return id; }
                String getName() { return name; }
                
                @Override
                public String toString() {
                    return "Task{id=" + id + ", name='" + name + "'}";
                }
            }
            
            private static class Result {
                private final int taskId;
                private final String result;
                
                Result(int taskId, String result) {
                    this.taskId = taskId;
                    this.result = result;
                }
                
                int getTaskId() { return taskId; }
                String getResult() { return result; }
                
                @Override
                public String toString() {
                    return "Result{taskId=" + taskId + ", result='" + result + "'}";
                }
            }
        }
        
        // Pipeline模式
        public static class PipelinePattern {
            private final ExecutorService executor = Executors.newFixedThreadPool(3);
            private final BlockingQueue<String> stage1Queue = new LinkedBlockingQueue<>();
            private final BlockingQueue<String> stage2Queue = new LinkedBlockingQueue<>();
            private final BlockingQueue<String> stage3Queue = new LinkedBlockingQueue<>();
            private final AtomicBoolean running = new AtomicBoolean(true);
            
            public void start() {
                // 启动各个阶段的处理器
                executor.submit(new Stage1Processor());
                executor.submit(new Stage2Processor());
                executor.submit(new Stage3Processor());
            }
            
            private class Stage1Processor implements Runnable {
                @Override
                public void run() {
                    int count = 0;
                    while (running.get()) {
                        try {
                            String data = "Data-" + count++;
                            stage1Queue.put(data);
                            log.info("Stage1处理: {}", data);
                            Thread.sleep(100);
                        } catch (InterruptedException e) {
                            Thread.currentThread().interrupt();
                            break;
                        }
                    }
                }
            }
            
            private class Stage2Processor implements Runnable {
                @Override
                public void run() {
                    while (running.get()) {
                        try {
                            String data = stage1Queue.poll(1, TimeUnit.SECONDS);
                            if (data != null) {
                                String processedData = data + "-Processed";
                                stage2Queue.put(processedData);
                                log.info("Stage2处理: {} -> {}", data, processedData);
                                Thread.sleep(150);
                            }
                        } catch (InterruptedException e) {
                            Thread.currentThread().interrupt();
                            break;
                        }
                    }
                }
            }
            
            private class Stage3Processor implements Runnable {
                @Override
                public void run() {
                    while (running.get()) {
                        try {
                            String data = stage2Queue.poll(1, TimeUnit.SECONDS);
                            if (data != null) {
                                String finalData = data + "-Final";
                                stage3Queue.put(finalData);
                                log.info("Stage3处理: {} -> {}", data, finalData);
                                Thread.sleep(200);
                            }
                        } catch (InterruptedException e) {
                            Thread.currentThread().interrupt();
                            break;
                        }
                    }
                }
            }
            
            public void shutdown() {
                running.set(false);
                executor.shutdown();
            }
        }
        
        // Actor模型
        public static class ActorModel {
            private final ExecutorService executor = Executors.newCachedThreadPool();
            private final Map<String, Actor> actors = new ConcurrentHashMap<>();
            
            public void createActor(String name, Actor actor) {
                actors.put(name, actor);
                executor.submit(actor);
            }
            
            public void sendMessage(String actorName, Object message) {
                Actor actor = actors.get(actorName);
                if (actor != null) {
                    actor.receive(message);
                }
            }
            
            public void shutdown() {
                actors.values().forEach(Actor::stop);
                executor.shutdown();
            }
            
            public static abstract class Actor implements Runnable {
                private final BlockingQueue<Object> mailbox = new LinkedBlockingQueue<>();
                private volatile boolean running = true;
                
                @Override
                public void run() {
                    while (running) {
                        try {
                            Object message = mailbox.poll(1, TimeUnit.SECONDS);
                            if (message != null) {
                                handleMessage(message);
                            }
                        } catch (InterruptedException e) {
                            Thread.currentThread().interrupt();
                            break;
                        }
                    }
                }
                
                public void receive(Object message) {
                    mailbox.offer(message);
                }
                
                public void stop() {
                    running = false;
                }
                
                protected abstract void handleMessage(Object message);
            }
        }
    }
}

🎯 并发与多线程优化的实际应用

1. 高并发Web服务 🚀

@Service
public class HighConcurrencyWebService {
    
    // 异步处理请求
    @Async
    public CompletableFuture<String> processRequestAsync(String request) {
        return CompletableFuture.supplyAsync(() -> {
            // 模拟处理时间
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
            return "Processed: " + request;
        });
    }
    
    // 批量处理请求
    public List<String> processBatchRequests(List<String> requests) {
        return requests.parallelStream()
                .map(this::processRequest)
                .collect(Collectors.toList());
    }
    
    private String processRequest(String request) {
        // 处理单个请求
        return "Processed: " + request;
    }
    
    // 限流处理
    public static class RateLimiter {
        private final Semaphore semaphore;
        private final ScheduledExecutorService scheduler;
        
        public RateLimiter(int permits) {
            this.semaphore = new Semaphore(permits);
            this.scheduler = Executors.newScheduledThreadPool(1);
            
            // 每秒释放一个许可
            scheduler.scheduleAtFixedRate(() -> {
                if (semaphore.availablePermits() < permits) {
                    semaphore.release();
                }
            }, 0, 1, TimeUnit.SECONDS);
        }
        
        public boolean tryAcquire() {
            return semaphore.tryAcquire();
        }
        
        public void acquire() throws InterruptedException {
            semaphore.acquire();
        }
        
        public void shutdown() {
            scheduler.shutdown();
        }
    }
}

2. 数据处理管道 📊

@Service
public class DataProcessingPipeline {
    
    // 并行数据处理
    public void processDataInParallel(List<DataRecord> data) {
        data.parallelStream()
                .filter(this::isValidRecord)
                .map(this::transformRecord)
                .forEach(this::processRecord);
    }
    
    private boolean isValidRecord(DataRecord record) {
        return record != null && record.isValid();
    }
    
    private DataRecord transformRecord(DataRecord record) {
        // 转换记录
        return record;
    }
    
    private void processRecord(DataRecord record) {
        // 处理记录
    }
    
    // 分阶段处理
    public void processDataInStages(List<DataRecord> data) {
        // 第一阶段:验证
        List<DataRecord> validatedData = data.parallelStream()
                .filter(this::isValidRecord)
                .collect(Collectors.toList());
        
        // 第二阶段:转换
        List<DataRecord> transformedData = validatedData.parallelStream()
                .map(this::transformRecord)
                .collect(Collectors.toList());
        
        // 第三阶段:处理
        transformedData.parallelStream()
                .forEach(this::processRecord);
    }
    
    private static class DataRecord {
        private final String data;
        private final long timestamp;
        
        DataRecord(String data, long timestamp) {
            this.data = data;
            this.timestamp = timestamp;
        }
        
        boolean isValid() {
            return data != null && !data.isEmpty();
        }
    }
}

🛡️ 并发与多线程优化的注意事项

1. 死锁避免 🔒

@Service
public class DeadlockPreventionService {
    
    // 锁顺序一致
    public static class LockOrderConsistency {
        private final Object lock1 = new Object();
        private final Object lock2 = new Object();
        
        public void method1() {
            synchronized (lock1) {
                synchronized (lock2) {
                    // 处理逻辑
                }
            }
        }
        
        public void method2() {
            synchronized (lock1) { // 保持相同的锁顺序
                synchronized (lock2) {
                    // 处理逻辑
                }
            }
        }
    }
    
    // 超时锁
    public static class TimeoutLock {
        private final ReentrantLock lock = new ReentrantLock();
        
        public boolean tryLockWithTimeout(long timeout, TimeUnit unit) {
            try {
                return lock.tryLock(timeout, unit);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                return false;
            }
        }
        
        public void unlock() {
            lock.unlock();
        }
    }
    
    // 死锁检测
    public static class DeadlockDetector {
        private final ThreadMXBean threadBean = ManagementFactory.getThreadMXBean();
        
        public void detectDeadlock() {
            long[] deadlockedThreads = threadBean.findDeadlockedThreads();
            if (deadlockedThreads != null) {
                log.error("检测到死锁,涉及线程: {}", Arrays.toString(deadlockedThreads));
                
                ThreadInfo[] threadInfos = threadBean.getThreadInfo(deadlockedThreads);
                for (ThreadInfo threadInfo : threadInfos) {
                    log.error("死锁线程信息: {}", threadInfo);
                }
            }
        }
    }
}

2. 性能监控 📊

@Service
public class ConcurrencyPerformanceMonitor {
    
    public void monitorThreadPool(ThreadPoolExecutor executor) {
        log.info("线程池状态: 核心线程数={}, 活跃线程数={}, 最大线程数={}, 队列大小={}", 
            executor.getCorePoolSize(),
            executor.getActiveCount(),
            executor.getMaximumPoolSize(),
            executor.getQueue().size());
        
        // 监控任务完成情况
        long completedTaskCount = executor.getCompletedTaskCount();
        long taskCount = executor.getTaskCount();
        log.info("任务完成情况: 已完成={}, 总任务数={}", completedTaskCount, taskCount);
    }
    
    public void monitorThreadStatus() {
        ThreadMXBean threadBean = ManagementFactory.getThreadMXBean();
        
        // 获取所有线程信息
        ThreadInfo[] threadInfos = threadBean.getThreadInfo(threadBean.getAllThreadIds());
        
        for (ThreadInfo threadInfo : threadInfos) {
            if (threadInfo != null) {
                log.info("线程状态: 名称={}, 状态={}, 阻塞时间={}ms", 
                    threadInfo.getThreadName(),
                    threadInfo.getThreadState(),
                    threadInfo.getBlockedTime());
            }
        }
    }
}

📊 并发与多线程优化监控:让性能可视化

@Component
public class ConcurrencyOptimizationMonitor {
    private final MeterRegistry meterRegistry;
    private final Timer taskTimer;
    private final Counter taskCounter;
    private final Gauge threadPoolSize;
    
    public ConcurrencyOptimizationMonitor(MeterRegistry meterRegistry) {
        this.meterRegistry = meterRegistry;
        this.taskTimer = Timer.builder("concurrency.task.execution.time")
                .register(meterRegistry);
        this.taskCounter = Counter.builder("concurrency.task.count")
                .register(meterRegistry);
        this.threadPoolSize = Gauge.builder("concurrency.threadpool.size")
                .register(meterRegistry);
    }
    
    public void recordTaskExecution(Duration duration, String taskType) {
        taskTimer.record(duration);
        taskCounter.increment(Tags.of("task", taskType));
    }
    
    public void recordThreadPoolSize(int size) {
        threadPoolSize.set(size);
    }
}

🎉 总结:并发与多线程优化让程序"多手"协作更高效

并发与多线程优化就像生活中的各种"协作"技巧:

  • 线程管理 = 管理员工团队 👥
  • 线程同步优化 = 协调交通信号灯 🤝
  • 线程通信优化 = 高效团队沟通 💬
  • 并发数据结构 = 安全的银行金库 🔒

通过合理使用并发与多线程优化,我们可以:

  • 🚀 大幅提升程序性能
  • ⚡ 改善系统响应
  • 🎯 提高资源利用率
  • 💪 增强系统稳定性

记住:并发优化不是万能的,但它是性能提升的利器! 合理使用并发与多线程优化,让你的Java应用运行如交响乐团般协调! ✨


"并发优化就像魔法,让程序多手协作,让性能更卓越!" 🪄🧵