14、Java 并发编程进阶:JUC(java.util.concurrent)详解

高并发JUC详解 多线程进阶之高并发编程 阅读详情

开篇概览:JUC 的核心价值与学习路径

JUC(java.util.concurrent) 是 Java 并发编程的高级武器库,由并发大师 Doug Lea 设计,旨在解决传统 synchronized 和 wait/notify 机制的局限性:

  • 性能瓶颈:重量级锁开销大;
  • 功能单一:缺乏灵活的线程协调机制;
  • 易错性高:死锁、活锁、虚假唤醒等问题频发。

JUC 的核心思想是:通过显式锁、原子变量、高级同步器和线程池框架,提供更细粒度的控制、更高的吞吐量和更强大的功能。

本章将严格遵循 “从基础到高级” 的学习路径,系统讲解 JUC 的四大阶段:

  1. 基石与核心概念(原子变量、显式锁);
  2. 线程管理与执行框架(线程池、Future);
  3. 高级同步器与并发数据结构(并发集合、同步器);
  4. 高级主题与性能优化(Fork/Join、CompletableFuture、底层原理)。

📌 学习前提:

  • 已掌握基础多线程知识(Thread、Runnable、synchronized);
  • 理解 Java 内存模型(JMM) 与 Happens-Before 原则。

第一阶段:JUC 基石与核心概念

1. JUC 概述与 Happens-Before 原则

1.1 Happens-Before 原则(JMM 核心)

Happens-Before 定义了操作间的可见性与有序性规则,确保多线程程序的正确性。关键规则包括:

  • 程序顺序规则:单线程内,前操作 Happens-Before 后操作;
  • 监视器锁规则:解锁操作 Happens-Before 后续加锁操作;
  • volatile 变量规则:对 volatile 变量的写操作 Happens-Before 后续读操作;
  • 线程启动/终止规则:start() Happens-Before 线程内任何操作;线程内操作 Happens-Before join() 返回。

✅ 意义:所有 JUC 组件(如 volatile、synchronized、Lock)都基于此原则保证线程安全。


2. 原子变量类(Atomic Variables)

2.1 核心原理:CAS(Compare-And-Swap)
  • 硬件级原子指令:CAS(value, expected, new);
  • 无锁编程:避免线程阻塞,提升并发性能;
  • ABA 问题:值从 A→B→A,CAS 误判为未修改(可用 AtomicStampedReference 解决)。
2.2 示例:AtomicInteger 与 ABA 问题
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicStampedReference;

public class AtomicDemo {
    public static void main(String[] args) throws InterruptedException {
        // 1. AtomicInteger:无锁计数器
        AtomicInteger counter = new AtomicInteger(0);
        Thread[] threads = new Thread[10];
        
        for (int i = 0; i < 10; i++) {
            threads[i] = new Thread(() -> {
                for (int j = 0; j < 1000; j++) {
                    counter.incrementAndGet(); // 原子自增
                }
            });
            threads[i].start();
        }
        
        for (Thread t : threads) t.join();
        System.out.println("AtomicInteger 结果: " + counter.get()); // 10000

        // 2. AtomicStampedReference:解决 ABA 问题
        AtomicStampedReference<String> ref = new AtomicStampedReference<>("A", 0);
        
        // 线程1:尝试将 A→B
        new Thread(() -> {
            int stamp = ref.getStamp();
            System.out.println("线程1 获取版本: " + stamp);
            try { Thread.sleep(100); } catch (InterruptedException e) {}
            boolean success = ref.compareAndSet("A", "B", stamp, stamp + 1);
            System.out.println("线程1 CAS 结果: " + success); // true
        }).start();
        
        // 线程2:模拟 ABA(A→C→A)
        new Thread(() -> {
            int stamp1 = ref.getStamp();
            ref.compareAndSet("A", "C", stamp1, stamp1 + 1);
            int stamp2 = ref.getStamp();
            ref.compareAndSet("C", "A", stamp2, stamp2 + 1);
            System.out.println("线程2 完成 ABA,当前版本: " + ref.getStamp());
        }).start();
        
        Thread.sleep(200);
    }
}

✅ 关键点:

  • AtomicInteger 适用于简单计数场景;
  • AtomicStampedReference 通过版本号解决 ABA 问题。

3. 显式锁(Explicit Locks)

3.1 ReentrantLock(可重入锁)
  • 优势:可中断、超时、公平锁;
  • 必须手动释放:在 finally 块中调用 unlock()。
3.2 示例:ReentrantLock 高级特性
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.TimeUnit;

public class ReentrantLockDemo {
    private final ReentrantLock lock = new ReentrantLock(true); // 公平锁
    private int count = 0;

    public void increment() {
        lock.lock(); // 获取锁
        try {
            count++;
        } finally {
            lock.unlock(); // 必须释放
        }
    }

    // 可中断的锁获取
    public void tryInterruptibly() throws InterruptedException {
        lock.lockInterruptibly(); // 可被 interrupt() 中断
        try {
            System.out.println("执行可中断任务");
        } finally {
            lock.unlock();
        }
    }

    // 尝试非阻塞获取锁
    public boolean tryLockWithTimeout() {
        try {
            if (lock.tryLock(1, TimeUnit.SECONDS)) { // 尝试等待1秒
                try {
                    System.out.println("成功获取锁");
                    return true;
                } finally {
                    lock.unlock();
                }
            } else {
                System.out.println("获取锁超时");
                return false;
            }
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            return false;
        }
    }

    public static void main(String[] args) throws InterruptedException {
        ReentrantLockDemo demo = new ReentrantLockDemo();
        
        // 测试可中断锁
        Thread t1 = new Thread(() -> {
            try {
                demo.tryInterruptibly();
            } catch (InterruptedException e) {
                System.out.println("线程被中断");
            }
        });
        t1.start();
        t1.interrupt(); // 中断线程
        
        // 测试超时锁
        demo.tryLockWithTimeout();
    }
}
3.3 ReadWriteLock(读写锁)
  • 读写分离:允许多个读线程并发,写线程独占;
  • 适用场景:读多写少(如缓存)。
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class ReadWriteLockDemo {
    private final ReadWriteLock lock = new ReentrantReadWriteLock();
    private String data = "初始数据";

    // 读操作(共享锁)
    public String read() {
        lock.readLock().lock();
        try {
            return data;
        } finally {
            lock.readLock().unlock();
        }
    }

    // 写操作(独占锁)
    public void write(String newData) {
        lock.writeLock().lock();
        try {
            data = newData;
            System.out.println("数据已更新: " + newData);
        } finally {
            lock.writeLock().unlock();
        }
    }

    public static void main(String[] args) {
        ReadWriteLockDemo demo = new ReadWriteLockDemo();
        
        // 多个读线程并发执行
        for (int i = 0; i < 3; i++) {
            new Thread(() -> {
                System.out.println("读取: " + demo.read());
            }).start();
        }
        
        // 写线程
        new Thread(() -> demo.write("新数据")).start();
    }
}

第二阶段:线程管理与执行框架

4. 线程池(ThreadPoolExecutor)

4.1 核心参数详解
参数说明
corePoolSize核心线程数(即使空闲也不回收)
maximumPoolSize最大线程数
keepAliveTime非核心线程空闲存活时间
workQueue任务队列(ArrayBlockingQueue, LinkedBlockingQueue)
threadFactory线程工厂(自定义线程名)
handler拒绝策略(AbortPolicy, CallerRunsPolicy 等)
4.2 示例:自定义线程池
import java.util.concurrent.*;

public class ThreadPoolDemo {
    public static void main(String[] args) {
        // 手动创建 ThreadPoolExecutor(避免 Executors 的陷阱)
        ThreadPoolExecutor executor = new ThreadPoolExecutor(
            2,                    // corePoolSize
            4,                    // maximumPoolSize
            10,                   // keepAliveTime (秒)
            TimeUnit.SECONDS,
            new ArrayBlockingQueue<>(2), // 有界队列
            new ThreadFactory() { // 自定义线程名
                private int count = 1;
                @Override
                public Thread newThread(Runnable r) {
                    return new Thread(r, "MyPool-Thread-" + count++);
                }
            },
            new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略:由调用者线程执行
        );

        // 提交6个任务(2核心 + 2队列 + 2最大 = 6)
        for (int i = 1; i <= 6; i++) {
            final int taskId = i;
            executor.submit(() -> {
                System.out.println("任务 " + taskId + " 由 " + 
                    Thread.currentThread().getName() + " 执行");
                try { Thread.sleep(1000); } catch (InterruptedException e) {}
            });
        }

        // 关闭线程池
        executor.shutdown();
        try {
            if (!executor.awaitTermination(60, TimeUnit.SECONDS)) {
                executor.shutdownNow();
            }
        } catch (InterruptedException e) {
            executor.shutdownNow();
        }
    }
}

✅ 拒绝策略:

  • AbortPolicy:抛出 RejectedExecutionException(默认);
  • CallerRunsPolicy:由提交任务的线程执行;
  • DiscardPolicy:静默丢弃;
  • DiscardOldestPolicy:丢弃队列最旧任务。

5. Future 与 Callable

5.1 Callable vs Runnable
特性RunnableCallable
返回值无有(V call())
异常不能抛出受检异常可抛出异常
5.2 示例:异步任务与结果获取
import java.util.concurrent.*;

public class FutureDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        
        // 提交 Callable 任务
        Callable<Integer> task = () -> {
            System.out.println("开始计算...");
            Thread.sleep(2000);
            return 42;
        };
        
        Future<Integer> future = executor.submit(task);
        
        // 异步检查任务状态
        while (!future.isDone()) {
            System.out.println("任务仍在执行...");
            Thread.sleep(500);
        }
        
        // 获取结果(阻塞)
        Integer result = future.get();
        System.out.println("计算结果: " + result); // 42
        
        executor.shutdown();
    }
}

第三阶段:高级同步器与并发数据结构

6. 并发集合

6.1 ConcurrentHashMap(高并发 HashMap)
  • JDK 8+:采用 CAS + synchronized 替代分段锁;
  • 高吞吐量:读操作无锁,写操作锁单个桶。
import java.util.concurrent.ConcurrentHashMap;

public class ConcurrentHashMapDemo {
    public static void main(String[] args) throws InterruptedException {
        ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
        
        // 多线程安全写入
        Thread[] threads = new Thread[10];
        for (int i = 0; i < 10; i++) {
            final int index = i;
            threads[i] = new Thread(() -> {
                for (int j = 0; j < 100; j++) {
                    map.compute("key" + index, (k, v) -> (v == null) ? 1 : v + 1);
                }
            });
            threads[i].start();
        }
        
        for (Thread t : threads) t.join();
        System.out.println("ConcurrentHashMap 大小: " + map.size()); // 10
    }
}
6.2 阻塞队列(BlockingQueue)
  • 生产者-消费者模式 的标准实现;
  • 自动阻塞:队列满时 put() 阻塞,空时 take() 阻塞。
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class BlockingQueueDemo {
    public static void main(String[] args) {
        BlockingQueue<String> queue = new ArrayBlockingQueue<>(2);
        
        // 生产者
        new Thread(() -> {
            try {
                for (int i = 1; i <= 5; i++) {
                    queue.put("Item-" + i); // 队列满时阻塞
                    System.out.println("生产: Item-" + i);
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }).start();
        
        // 消费者
        new Thread(() -> {
            try {
                while (true) {
                    String item = queue.take(); // 队列空时阻塞
                    System.out.println("消费: " + item);
                    Thread.sleep(1000);
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }).start();
    }
}

7. 同步器(Synchronizers)

7.1 CountDownLatch(倒计时门闩)
  • 一次性:计数归零后无法重置;
  • 典型场景:主线程等待多个子线程完成。
import java.util.concurrent.CountDownLatch;

public class CountDownLatchDemo {
    public static void main(String[] args) throws InterruptedException {
        CountDownLatch latch = new CountDownLatch(3);
        
        for (int i = 0; i < 3; i++) {
            new Thread(() -> {
                System.out.println("服务启动中...");
                try { Thread.sleep(1000); } catch (InterruptedException e) {}
                latch.countDown(); // 计数减1
            }).start();
        }
        
        latch.await(); // 等待计数归零
        System.out.println("所有服务已启动,开始处理请求");
    }
}
7.2 CyclicBarrier(循环栅栏)
  • 可重用:到达屏障点后重置计数;
  • 典型场景:多线程分阶段计算。
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierDemo {
    public static void main(String[] args) {
        // 栅栏动作:所有线程到达后执行
        CyclicBarrier barrier = new CyclicBarrier(3, () -> {
            System.out.println("=== 阶段完成,开始下一阶段 ===");
        });
        
        for (int i = 0; i < 3; i++) {
            new Thread(() -> {
                try {
                    System.out.println("线程 " + Thread.currentThread().getName() + " 阶段1");
                    barrier.await(); // 等待其他线程
                    
                    System.out.println("线程 " + Thread.currentThread().getName() + " 阶段2");
                    barrier.await();
                } catch (InterruptedException | BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }
}
7.3 Semaphore(信号量)
  • 控制并发数:类似“许可证”机制;
  • 典型场景:数据库连接池、限流。
import java.util.concurrent.Semaphore;

public class SemaphoreDemo {
    // 模拟只有2个数据库连接
    private static final Semaphore semaphore = new Semaphore(2);
    
    public static void accessDatabase(String threadName) {
        try {
            semaphore.acquire(); // 获取许可证
            System.out.println(threadName + " 获取数据库连接");
            Thread.sleep(2000); // 模拟数据库操作
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        } finally {
            semaphore.release(); // 释放许可证
            System.out.println(threadName + " 释放数据库连接");
        }
    }
    
    public static void main(String[] args) {
        for (int i = 1; i <= 5; i++) {
            final String name = "线程-" + i;
            new Thread(() -> accessDatabase(name)).start();
        }
    }
}

第四阶段:高级主题与性能优化

8. Fork/Join 框架

8.1 核心思想:分而治之 + 工作窃取
  • Fork:任务拆分;
  • Join:结果合并;
  • 工作窃取:空闲线程从其他队列“窃取”任务。
8.2 示例:并行计算数组和
import java.util.concurrent.RecursiveTask;
import java.util.concurrent.ForkJoinPool;

public class ForkJoinDemo extends RecursiveTask<Long> {
    private final long[] array;
    private final int start;
    private final int end;
    private static final int THRESHOLD = 1000; // 拆分阈值

    public ForkJoinDemo(long[] array, int start, int end) {
        this.array = array;
        this.start = start;
        this.end = end;
    }

    @Override
    protected Long compute() {
        if (end - start <= THRESHOLD) {
            // 小任务直接计算
            long sum = 0;
            for (int i = start; i < end; i++) {
                sum += array[i];
            }
            return sum;
        } else {
            // 大任务拆分
            int mid = (start + end) / 2;
            ForkJoinDemo leftTask = new ForkJoinDemo(array, start, mid);
            ForkJoinDemo rightTask = new ForkJoinDemo(array, mid, end);
            
            leftTask.fork(); // 异步执行左任务
            Long rightResult = rightTask.compute(); // 同步执行右任务
            Long leftResult = leftTask.join(); // 等待左任务结果
            
            return leftResult + rightResult;
        }
    }

    public static void main(String[] args) {
        long[] array = new long[10_000_000];
        for (int i = 0; i < array.length; i++) {
            array[i] = i;
        }
        
        ForkJoinPool pool = new ForkJoinPool();
        ForkJoinDemo task = new ForkJoinDemo(array, 0, array.length);
        long sum = pool.invoke(task);
        
        System.out.println("数组总和: " + sum);
        pool.shutdown();
    }
}

9. CompletableFuture(Java 8+)

9.1 核心优势:异步流水线
  • 非阻塞:避免 Future.get() 的阻塞;
  • 链式调用:组合多个异步任务;
  • 异常处理:exceptionally() 统一处理。
9.2 示例:异步任务组合
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;

public class CompletableFutureDemo {
    public static void main(String[] args) throws InterruptedException {
        // 1. 异步执行任务
        CompletableFuture<String> future1 = CompletableFuture
            .supplyAsync(() -> {
                sleep(1);
                return "Hello";
            });
        
        CompletableFuture<String> future2 = CompletableFuture
            .supplyAsync(() -> {
                sleep(2);
                return "World";
            });
        
        // 2. 组合两个任务的结果
        CompletableFuture<String> combined = future1
            .thenCombine(future2, (s1, s2) -> s1 + " " + s2)
            .thenApply(String::toUpperCase);
        
        // 3. 处理结果
        combined.thenAccept(System.out::println) // HELLO WORLD
                .join(); // 等待完成
        
        // 4. 异常处理
        CompletableFuture<String> errorFuture = CompletableFuture
            .supplyAsync(() -> {
                throw new RuntimeException("模拟异常");
            })
            .exceptionally(ex -> "默认值");
        
        System.out.println("异常处理结果: " + errorFuture.join()); // 默认值
    }
    
    private static void sleep(int seconds) {
        try {
            TimeUnit.SECONDS.sleep(seconds);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }
}

10. 底层原理:AQS(AbstractQueuedSynchronizer)

10.1 AQS 核心设计
  • state:同步状态(如锁计数、信号量许可数);
  • CLH 队列:FIFO 等待队列(线程节点组成);
  • 模板方法:子类实现 tryAcquire()/tryRelease() 定义同步逻辑。
10.2 AQS 在 JUC 中的应用
组件AQS state 含义
ReentrantLock锁的持有次数
CountDownLatch计数器值
Semaphore剩余许可数
ReentrantReadWriteLock高16位读锁计数,低16位写锁计数

✅ 学习建议:

  • 从 ReentrantLock 源码入手,理解 NonfairSync/FairSync;
  • 阅读 CountDownLatch 的 Sync 内部类,掌握 state 变化逻辑。

总结:JUC 学习全景图

阶段核心组件典型应用场景
基石Atomic*, ReentrantLock, ReadWriteLock无锁计数、灵活锁控制
线程管理ThreadPoolExecutor, Future任务调度、异步结果
高级同步ConcurrentHashMap, BlockingQueue, CountDownLatch高并发集合、生产者-消费者、线程协调
高级优化ForkJoinPool, CompletableFuture, AQS并行计算、异步流水线、底层原理

📌 终极建议:
“先会用,再懂理;先模仿,再创新。”
从 AtomicInteger 和 ThreadPoolExecutor 开始实践,逐步挑战 AQS 源码。掌握 JUC,你将具备设计高并发、高可用系统的硬核能力。

JUC 高并发编程的入门学习 课程内容概览 什么是 JUC Lock 接口 线程间通信 集合的线程安全 多线程锁 Callable 接口 JUC 三大辅助类: CountDownLatch CyclicBarrier Semaphore 读写锁: ReentrantReadWriteLock 阻塞队列 ThreadPool 线程池 Fork/Join 框架 CompletableFuture 1 什么是 JUC 1.1 JUC 简介 在 Java 中,线程部分是一个重点,本篇文章说的 JUC 也是关于线程的。JUC就是 java.u 阅读详情

相关推荐

Java - JUC(java.util.concurrent)包详解,其下的锁、安全集合类、线程池相关、线程创建相关和线程辅助类、阻塞队列

JUC是什么? Java中线程有六个状态 JUC的结构 synchronized和JUC的Lock   reentrantLock   Condition   JUC下的读写锁ReentrantReadWriteLock 不安全的集合类和JUC的collections   list 不安全-CpoyOnWriteArrayList   set 不安全-CopyOnWriteArraySet   HashMap不安全-ConcurrentHashMap JUC的Callab

m0_65228708的博客 2389

【JUC基础学习笔记】

JUC基础学习笔记一、JUC概述1. JUC是什么2. 进程与线程3. 并发与并行4. sleep() 和 wait()等方法二、Lock1. Synchronized2. Lock接口与方法3. 两者异同4. Lock接口重要实现类三、线程通信 / 线程同步1. Synchronized同步块2. Lock锁四、线程安全1. 阻塞同步2. 非阻塞同步3. 非同步五、集合的线程安全1. 并发集合 ArrayList2. Vector3. Collections4. JUC.CopyOnWriteList..

sixteen_16的博客 1万+

STM32+ESP8266接入OneNet物联网平台全流程

MQTT协议是物联网设备与云平台通信的主流轻量级消息传输标准,其发布/订阅模型天然适配嵌入式资源受限场景;OneJSON作为中国移动OneNet平台定制的数据格式,在标准JSON基础上精简Schema、降低解析开销,显著提升STM32等MCU的处理效率。该技术组合兼顾安全性、低功耗与工程可量产性,广泛应用于环境监测、智能仪表、工业传感器等远程数据采集系统。实际落地需协同完成云平台物模型定义、Token动态认证、MQTT Topic严格构造、AT指令可靠交互及单总线传感器数据融合等关键环节。本文以DS18B2

u5v6w7的博客 1119

JUC详解

什么是JUC? JUC其实就是JDK中的三个包: java.util.concurrent 并发相关的 java.util.concurrent.atomic 原子性 java.util.concurrent.locks lock锁 Runnable 没有返回值,效率相比Callable相对较低。 进程:一个程序,QQ,Music.exe 程序的集合 ;一个进程可以包含多个线程,至少包含一个。 Java默认有几个线程? 2个 main线程和GC线程(做垃圾回收) Java可以开启

weixin_53379153的博客 1万+

别再踩坑了!QT5.15.2配置Android开发环境保姆级避坑指南(含Java8、SDK Tools版本选择)

本文提供QT5.15.2配置Android开发环境的详细避坑指南,重点解决版本锁定、SDK工具选择和QtCreator配置等常见问题。通过实测推荐的Java8、Android SDK Tools版本及NDK配置,帮助开发者高效完成环境搭建,避免隐性冲突和配置失败。

weixin_42537919的博客 237

关于使用CMT2300A FIFO缓存区间设置为64Byte的问题

帮助你解决在使用CMT2300A 时遇到的各种问题,若有需要,请及时与我交流

teleger的博客 1428

JUC 第1章JUC简介

JUC简介 是什么 java.util.concurrent在并发编程中使用的工具类 2.进程/线程回顾 2.1进程/线程 进程:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。 线程:通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有...

尚硅谷铁杆粉丝的博客 1714

当windows安装git时出现以下错误提示

Windows安装Git时出现多个系统配置设置失败错误(exit code 4294967295),提示包括无法设置textconv、LFS过滤器和SSL等配置项。关键问题在于scalar.exe版本不兼容,系统提示"该版本的scalar.exe与你运行的Windows版本不兼容"。解决方案是检查程序版本是否正确,下载与Windows系统兼容的正确版本重新安装即可。

沧澜的博客 1874

java--JUC快速入门(彻底搞懂JUC)

java–JUC快速入门(彻底搞懂JUC) 文章目录java--JUC快速入门(彻底搞懂JUC)1、学习多线程之前需要知道的一些概念。2、JUC的结构3、Lock锁(重点)4、集合类不安全5、Callable()6、常用的辅助类7、读写锁8、阻塞队列9、线程池 1、学习多线程之前需要知道的一些概念。 1.1 JUC是什么? JUC是java.util.concurrent包的简称,在Java5.0添加,目的就是为了更好的支持高并发任务。让开发者进行多线程编程时减少竞争条件和死锁的问题!...

weixin_43888181的博客 12万+

Cesium+Vue3教程(003):基于Vue3的Cesium自定义地图和地图叠加

在 Cesium 中,是用于加载地表影像图层的核心接口。通过它,您可以将各种地图服务(如卫星影像、街道地图、自定义瓦片等)加载到 Cesium 的地球上。Cesium 提供了多个内置的。

WwLK123的博客 633

【量化入门】Tushare库获取公募基金的历史净值

在本文中,我们将介绍如何使用Python的Tushare库获取公募基金的历史净值。

木头大左的博客 1138

JUC并发编程(java.util .concurrent工具包)详解与实例演示

JUC 并发编程 作者:pox21s 概述 在Java中,线程部分是一个重点,本篇文章说的是关于线程并发编程。JUC就是java.util .concurrent工具包的简称。这是一个处理线程的工具包,从JDK 1.5开始出现。 1.基本概念 1.1 进程和线程 1.1.1 定义 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个基本单位。 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥

BaiKnow的博客 1966

使用Python的OpenCV库进行三维重建点云

通过这些步骤,我们可以使用Python的OpenCV库进行三维重建,并生成对应的点云。当然,这只是一个简单的示例,实际的三维重建可能涉及更多的图像处理和计算步骤。在计算机视觉领域,三维重建是一项重要的任务,它可以将多个二维图像或视频序列转换为三维场景模型。在本文中,我们将介绍如何使用Python的OpenCV库进行三维重建,并生成相应的点云。以上是使用Python的OpenCV库进行三维重建点云的简要介绍和示例代码。最后,我们可以将计算得到的三维点云可视化。安装完成后,我们可以开始编写代码。

AuSwift的博客 1646

并发 -- JUC(java.util.concurrent) 包的简单介绍

Java并发工具包JUC(java.util.concurrent)是Java进行多线程编程的核心工具集,主要包含:1)锁机制(ReentrantLock、ReadWriteLock等替代synchronized);2)线程安全集合(ConcurrentHashMap、BlockingQueue等);3)线程池(ThreadPoolExecutor)及任务调度;4)原子操作类(AtomicInteger等基于CAS实现);5)同步辅助工具(CountDownLatch、Semaphore等)。使用建议包括优

你我约定有三的博客 1406

XDMA Scatter-Gather(SG)模式

XDMA Scatter-Gather(SG)模式 是 Xilinx FPGA 中用于高效处理 ​非连续内存数据 的 DMA 传输机制,通过 ​描述符链表(Descriptor List)​ 管理多块分散数据,显著减少 CPU 开销并提升吞吐量。

浩瀚之水的专栏 2125

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

JUC下的Java java.util.concurrent.Locks详解

java.util.concurrent.locks 包是Java并发编程中非常重要的一个部分,它提供了比内置synchronized关键字更为灵活的锁机制,用于多线程环境下的同步控制。这个包中最核心的是Lock接口,以及一系列实现类,如ReentrantLock, ReentrantReadWriteLock, StampedLock, 和Condition接口等。

Rcain_R的博客 1399

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

JUC 并发编程学习笔记(总)

JUC指的就是工具包的简称,里面的工具类可以很方便的实现多线程的开发。java.util工具包、包、分类。业务:普通的线程代码 Thread。Runnable没有返回值、效率相比Callable相对较低!

Java技术一点通 3315

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【Java多线程】面试常考 —— JUC(java.util.concurrent) 的常见类

semaphore 信息量的概念抽象:停车场入口立着的那个显示屏,每有一辆车进入停车场显示屏就会显示剩余车位减1,每有一辆车从停车场出去,显示屏上显示的剩余车辆就会加1,当显示屏上的剩余车位为0时,停车场入口的栏杆就不会再打开,车辆就无法进入停车场了,直到有一辆车从停车场出去为止。

Hacynn的博客 2772

常用的JUC(Java Util Concurrent)工具类

包下的原子类为Java并发编程提供了一组高效的、线程安全的原子操作类,它们主要用于在高并发环境下确保对共享变量的操作具有原子性,即在同一时刻只有一个线程能够修改这些变量的值,而不会出现因多线程并发导致的中间状态或数据竞争问题。当两个线程都到达交换点时,它们各自携带的数据会被互换,确保线程间的通信和协作。,等待其他线程也到达屏障。当所有线程都到达后,屏障动作执行,然后屏障重置,线程们继续进行下一次迭代,如此反复三次。的特性,它们各自操作的是独立的本地副本,因此输出结果互不影响,展示了线程间数据的隔离。

weixin_44440231的博客 2630

【Java多线程】(拓展1) Java Util Concurrent (JUC)

随着多核处理器的普及,单一线程的性能已无法满足现代应用程序的需求。JUC 旨在简化多线程编程,提高程序的并发性能,使开发人员能够更容易地实现高效的并发应用。JUC 提供了更高级的工具,如线程池、并发集合和同步工具类,帮助开发者高效地处理并发问题。包提供了一系列的原子类,用于在多线程环境中实现安全的变量更新。用于控制对某个资源的访问数量,可以限制同时访问某个资源的线程数量。允许多个线程同时读,但写操作是互斥的,适合读多写少的场景。的一个子接口,提供了更丰富的方法来管理和控制线程。

A1924的博客 967

Java JUC 详解:并发.util.concurrent 并发工具包指南

JUC 为 Java 并发编程提供了强大的工具支持,大大简化了多线程程序的开发难度。掌握 JUC 的使用,能够帮助开发者编写高效、安全的并发程序,应对多线程环境下的各种挑战。在实际开发中,应根据具体场景选择合适的并发工具,同时注意线程安全和性能之间的平衡。通过不断实践和深入理解这些工具的原理,您将能够构建出更健壮、更高效的并发应用程序。

m0_57836225的博客 1182

Java并发编程和JUC

Java并发编程和JUC

qq_38496750的博客 660

JUC(java.util.concurrent)的常见类

我们的停车场的大牌子上就写着,当前剩余车位xx个,当有车进去,就相当于进行了一次P操作,计数器-1,当有车从停车场出来,就相当于进行了一次V操作,计数器+1,当我们的停车场的剩余车位为0时,也就是计数器为0时,如果有车想停车,要么在这里等,要么就去其他停车场。不能直接放进去,也很简单,因为我们的Callable是带有返回值的,可能有多个线程去执行同一个callable的任务,而且啥时候执行完并不确定,所以我们这里无法获取到返回值,我们的Synchronized也是我们标准库提供的锁,那么它们有什么区别呢?

buhuisuanfa的博客 1866

【并发编程】Java并发编程进阶

本文介绍了CAS操作以及Java中实现的原子类,还有JUC中一些重要的类和属性

telasi2004的博客 1214

Java并发编程核心利器:深入解析JUC三大工具包

并发编程框架Executor框架:线程池管理,资源复用并发集合:线程安全的集合类同步器:CountDownLatch、CyclicBarrier等并发工具:CompletableFuture、ForkJoinPool- 原子操作基本类型原子类:AtomicInteger、AtomicLong等引用类型原子类:AtomicReference、AtomicStampedReference数组原子类:AtomicIntegerArray等。

用文字记录技术,用分享回馈社区,用坚持见证成长 3192

Java Util Concurrent(JUC)

本文摘要:介绍了Java并发编程工具包(JUC)的核心内容,包括线程创建方法(继承Thread、实现Runnable、Callable+FutureTask)、线程状态、锁优化机制(偏向锁、轻量级锁、重量级锁)、ReentrantLock特性(可中断、超时、公平锁、条件变量)、volatile原理(内存屏障、可见性、禁止重排序),以及单例模式的双重检查锁定问题解决方案。重点讲解了多线程开发中的关键技术和性能优化手段。

m0_60500662的博客 627
上一篇: 13、Java 多线程与并发编程详解
下一篇: 1、Java 后端权限系统深度指南:从理论到实战
龙茶清欢
博客等级 码龄7年 3720粉丝 375原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值