JUC相关知识点总结

Java JUC(java.util.concurrent)是Java并发编程的核心工具包,提供了丰富的并发工具类和框架。以下是JUC的主要知识点,按难易程度分类,供你参考:


1. 基础概念与工具类

1.1 并发与并行(易)

  • 内容:理解并发(Concurrency)和并行(Parallelism)的区别。
  • 重要性:基础概念,理解并发编程的前提。

1.2 线程与线程池(中)

  • 内容
    • 线程的创建与启动(ThreadRunnable)。
    • 线程池(ExecutorServiceThreadPoolExecutor)。
    • 线程池参数(核心线程数、最大线程数、队列类型、拒绝策略)。
  • 重要性:线程池是并发编程的核心工具,必须掌握。

1.3 线程生命周期与状态(易)

  • 内容 :线程的6种状态(NEWRUNNABLEBLOCKEDWAITINGTIMED_WAITINGTERMINATED)。
  • 重要性:理解线程状态是调试并发问题的基础。

2. 同步与锁

2.1 synchronized关键字(易)

  • 内容
    • 方法同步与代码块同步。
    • 锁的粒度与性能优化。
  • 重要性:最基础的同步机制。

2.2 ReentrantLock(中)

  • 内容
    • 可重入锁的基本使用。
    • 公平锁与非公平锁。
    • tryLocklockInterruptibly等高级特性。
  • 重要性 :比synchronized更灵活的锁机制。

2.3 ReadWriteLock(中)

  • 内容
    • 读写锁(ReentrantReadWriteLock)。
    • 读锁与写锁的分离。
  • 重要性:适用于读多写少的场景。

2.4 StampedLock(难)

  • 内容
    • 乐观读锁与悲观读锁。
    • 锁的升级与降级。
  • 重要性:高性能锁,适用于特定场景。

3. 原子操作类

3.1 AtomicIntegerAtomicLong等(易)

  • 内容
    • 原子操作的基本使用。
    • compareAndSet(CAS)原理。
  • 重要性:无锁编程的基础。

3.2 AtomicReferenceAtomicStampedReference(中)

  • 内容
    • 引用类型的原子操作。
    • 解决ABA问题。
  • 重要性:适用于复杂对象的原子操作。

3.3 LongAdderDoubleAdder(中)

  • 内容
    • 高并发场景下的累加器。
    • 分段锁机制。
  • 重要性 :比AtomicLong性能更高。

4. 并发集合

4.1 ConcurrentHashMap(中)

  • 内容
    • 分段锁与CAS机制。
    • 高并发下的性能优化。
  • 重要性:最常用的并发集合。

4.2 CopyOnWriteArrayListCopyOnWriteArraySet(易)

  • 内容
    • 写时复制机制。
    • 适用场景与性能特点。
  • 重要性:适用于读多写少的场景。

4.3 BlockingQueue及其实现类(中)

  • 内容
    • ArrayBlockingQueueLinkedBlockingQueue
    • PriorityBlockingQueueSynchronousQueue
    • puttake等阻塞操作。
  • 重要性:生产者-消费者模型的实现基础。

4.4 ConcurrentLinkedQueueConcurrentSkipListMap(难)

  • 内容
    • 无锁队列与跳表。
    • 高并发场景下的性能优势。
  • 重要性:适用于高性能无锁场景。

5. 同步工具类

5.1 CountDownLatch(易)

  • 内容
    • 等待多个线程完成任务。
  • 重要性:多线程协作的基础工具。

5.2 CyclicBarrier(中)

  • 内容
    • 多线程到达屏障后继续执行。
    • CountDownLatch的区别。
  • 重要性:适用于分阶段任务。

5.3 Semaphore(中)

  • 内容
    • 控制并发线程数。
    • 信号量的基本使用。
  • 重要性:资源池管理的核心工具。

5.4 Phaser(难)

  • 内容
    • 多阶段任务同步。
    • 动态调整参与线程数。
  • 重要性:适用于复杂任务调度。

5.5 Exchanger(难)

  • 内容
    • 线程间数据交换。
  • 重要性:适用于特定场景。

6. 异步编程

6.1 FutureFutureTask(中)

  • 内容
    • 异步任务的结果获取。
    • get方法的阻塞特性。
  • 重要性:异步编程的基础。

6.2 CompletableFuture(难)

  • 内容
    • 链式调用与组合操作。
    • thenApplythenAcceptthenCombine等方法。
  • 重要性:现代异步编程的核心工具。

7. 线程调度与定时任务

7.1 ScheduledExecutorService(中)

  • 内容
    • 定时任务与周期性任务。
  • 重要性 :替代Timer的推荐工具。

7.2 ForkJoinPool(难)

  • 内容
    • 分治算法与工作窃取。
    • RecursiveTaskRecursiveAction
  • 重要性:适用于计算密集型任务。

8. 其他高级特性

8.1 ThreadLocal(中)

  • 内容
    • 线程本地变量。
    • 内存泄漏问题。
  • 重要性:线程间数据隔离的工具。

8.2 AQS(AbstractQueuedSynchronizer)(难)

  • 内容
    • 同步器的底层实现。
    • 自定义锁与同步工具。
  • 重要性:理解JUC底层机制的关键。

8.3 内存模型与volatile(中)

  • 内容
    • 可见性、有序性、原子性。
    • happens-before原则。
  • 重要性:理解并发编程的基础。

学习建议

  1. 从易到难:先掌握基础概念和工具类,再深入学习高级特性。
  2. 动手实践:通过编写代码加深理解,尤其是并发集合和同步工具类。
  3. 阅读源码 :特别是AQSConcurrentHashMap等核心类的源码。
  4. 调试与测试:使用工具(如JConsole、VisualVM)分析并发问题。

通过系统学习以上知识点,你将全面掌握Java JUC的核心内容,并能够应对实际开发中的并发编程挑战。

详细演示上面功能


Java JUC 知识点完整汇总


1. 基础概念与工具类

1.1 并发与并行

描述

  • 并发:多个任务交替执行,适用于单核 CPU 或多线程任务。
  • 并行:多个任务同时执行,需要多核 CPU 支持。
  • 适用范围:理解并发与并行的区别是并发编程的基础。
  • 注意点:并行需要硬件支持(多核 CPU)。
  • 实现原理:并发通过线程切换实现,并行通过多核 CPU 实现。

代码示例

java 复制代码
public class ConcurrencyVsParallelism {
    public static void main(String[] args) {
        // 并发:多个任务交替执行
        Runnable task = () -> System.out.println(Thread.currentThread().getName() + " is running");
        new Thread(task).start(); // 启动线程1
        new Thread(task).start(); // 启动线程2

        // 并行:多个任务同时执行(需要多核CPU支持)
        ExecutorService executor = Executors.newFixedThreadPool(2); // 创建固定大小的线程池
        executor.submit(task); // 提交任务1
        executor.submit(task); // 提交任务2
        executor.shutdown(); // 关闭线程池
    }
}

1.2 线程与线程池

描述

  • 线程:Java 中最基本的并发单元。
  • 线程池:管理线程的生命周期,避免频繁创建和销毁线程。
  • 适用范围:需要频繁创建线程的场景。
  • 注意点:线程池参数(核心线程数、最大线程数、队列类型、拒绝策略)需要合理配置。
  • 实现原理:线程池通过任务队列和工作线程实现任务调度。

代码示例

java 复制代码
public class ThreadPoolExample {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(2); // 创建固定大小的线程池
        executor.submit(() -> System.out.println("Task 1")); // 提交任务1
        executor.submit(() -> System.out.println("Task 2")); // 提交任务2
        executor.shutdown(); // 关闭线程池
    }
}

1.3 线程生命周期与状态

描述

  • 线程状态NEWRUNNABLEBLOCKEDWAITINGTIMED_WAITINGTERMINATED
  • 适用范围:调试和分析线程行为。
  • 注意点:线程状态是 JVM 管理的,开发者无法直接控制。
  • 实现原理:JVM 通过内部状态机管理线程状态。

代码示例

java 复制代码
public class ThreadStateExample {
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(() -> {
            try {
                Thread.sleep(1000); // TIMED_WAITING
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        System.out.println(thread.getState()); // NEW
        thread.start();
        System.out.println(thread.getState()); // RUNNABLE
        thread.join();
        System.out.println(thread.getState()); // TERMINATED
    }
}

2. 同步与锁

2.1 synchronized

描述

  • 适用范围:简单的线程同步场景。
  • 注意点:锁的粒度要尽量小,避免性能问题。
  • 实现原理 :基于 JVM 内置锁机制,通过 monitorentermonitorexit 指令实现。

代码示例

java 复制代码
public class SynchronizedExample {
    private static class Counter {
        private int count = 0;
        public synchronized void increment() {
            count++; // 临界区操作
        }
        public int getCount() {
            return count;
        }
    }

    public static void main(String[] args) throws InterruptedException {
        Counter counter = new Counter();
        Runnable task = () -> {
            for (int i = 0; i < 1000; i++) {
                counter.increment(); // 调用同步方法
            }
        };
        Thread thread1 = new Thread(task); // 创建线程1
        Thread thread2 = new Thread(task); // 创建线程2
        thread1.start(); // 启动线程1
        thread2.start(); // 启动线程2
        thread1.join(); // 等待线程1完成
        thread2.join(); // 等待线程2完成
        System.out.println("Final count: " + counter.getCount()); // 输出最终结果
    }
}

2.2 ReentrantLock

描述

  • 适用范围:需要更灵活的锁控制(如可中断锁、超时锁)。
  • 注意点:必须手动释放锁,否则会导致死锁。
  • 实现原理 :基于 AQS(AbstractQueuedSynchronizer)实现。

代码示例

java 复制代码
import java.util.concurrent.locks.ReentrantLock;

public class ReentrantLockExample {
    private static class Counter {
        private int count = 0;
        private final ReentrantLock lock = new ReentrantLock(); // 创建 ReentrantLock
        public void increment() {
            lock.lock(); // 获取锁
            try {
                count++; // 临界区操作
            } finally {
                lock.unlock(); // 释放锁
            }
        }
        public int getCount() {
            return count;
        }
    }

    public static void main(String[] args) throws InterruptedException {
        Counter counter = new Counter();
        Runnable task = () -> {
            for (int i = 0; i < 1000; i++) {
                counter.increment(); // 调用同步方法
            }
        };
        Thread thread1 = new Thread(task); // 创建线程1
        Thread thread2 = new Thread(task); // 创建线程2
        thread1.start(); // 启动线程1
        thread2.start(); // 启动线程2
        thread1.join(); // 等待线程1完成
        thread2.join(); // 等待线程2完成
        System.out.println("Final count: " + counter.getCount()); // 输出最终结果
    }
}

3. 原子操作类

3.1 AtomicInteger

描述

  • 适用范围:无锁的线程安全计数器。
  • 注意点:适用于简单的原子操作,复杂场景可能需要锁。
  • 实现原理:基于 CAS(Compare-And-Swap)实现。

代码示例

java 复制代码
import java.util.concurrent.atomic.AtomicInteger;

public class AtomicIntegerExample {
    public static void main(String[] args) {
        AtomicInteger atomicInt = new AtomicInteger(0); // 初始化值为 0
        atomicInt.incrementAndGet(); // 原子操作:自增并返回新值
        atomicInt.addAndGet(5); // 原子操作:增加指定值并返回新值
        System.out.println("Final value: " + atomicInt.get()); // 输出最终值
    }
}

4. 并发集合

4.1 ConcurrentHashMap

描述

  • 适用范围:高并发场景下的键值对存储。
  • 注意点 :不支持 null 键和值。
  • 实现原理:分段锁 + CAS 机制。

代码示例

java 复制代码
import java.util.concurrent.ConcurrentHashMap;

public class ConcurrentHashMapExample {
    public static void main(String[] args) {
        ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>(); // 创建 ConcurrentHashMap
        map.put("a", 1); // 插入键值对
        map.put("b", 2); // 插入键值对
        System.out.println("Value for key 'a': " + map.get("a")); // 获取值
    }
}

5. 同步工具类

5.1 CountDownLatch

描述

  • 适用范围:等待多个线程完成任务。
  • 注意点:计数器不能重置。
  • 实现原理:基于 AQS 实现。

代码示例

java 复制代码
import java.util.concurrent.CountDownLatch;

public class CountDownLatchExample {
    public static void main(String[] args) throws InterruptedException {
        CountDownLatch latch = new CountDownLatch(2); // 初始化计数器为 2
        new Thread(() -> {
            System.out.println("Task 1 completed");
            latch.countDown(); // 计数器减 1
        }).start();
        new Thread(() -> {
            System.out.println("Task 2 completed");
            latch.countDown(); // 计数器减 1
        }).start();
        latch.await(); // 阻塞直到计数器为 0
        System.out.println("All tasks completed");
    }
}

6. 异步编程

6.1 Future

描述

  • 适用范围:异步任务的结果获取。
  • 注意点get() 方法会阻塞,直到任务完成。
  • 实现原理 :基于 RunnableCallable 实现。

代码示例

java 复制代码
import java.util.concurrent.*;

public class FutureExample {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ExecutorService executor = Executors.newSingleThreadExecutor(); // 创建单线程线程池
        Future<Integer> future = executor.submit(() -> 1 + 1); // 提交任务
        System.out.println("Task result: " + future.get()); // 获取任务结果
        executor.shutdown(); // 关闭线程池
    }
}

7. 线程调度与定时任务

7.1 ScheduledExecutorService

描述

  • 适用范围:定时任务和周期性任务。
  • 注意点:任务执行时间过长会影响后续任务。
  • 实现原理:基于线程池和任务队列。

代码示例

java 复制代码
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class ScheduledExecutorServiceExample {
    public static void main(String[] args) {
        ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); // 创建调度线程池
        scheduler.schedule(() -> System.out.println("Task executed"), 1, TimeUnit.SECONDS); // 延迟执行
        scheduler.shutdown(); // 关闭线程池
    }
}

8. 其他高级特性

8.1 ThreadLocal

描述

  • 适用范围:线程间数据隔离。
  • 注意点:可能导致内存泄漏,需要及时清理。
  • 实现原理 :每个线程维护一个独立的 ThreadLocalMap

代码示例

java 复制代码
public class ThreadLocalExample {
    private static final ThreadLocal<String> threadLocal = ThreadLocal.withInitial(() -> "Initial Value");

    public static void main(String[] args) {
        new Thread(() -> {
            threadLocal.set("Thread 1 Value"); // 设置线程本地变量
            System.out.println("Thread 1: " + threadLocal.get()); // 获取线程本地变量
        }).start();
        new Thread(() -> {
            threadLocal.set("Thread 2 Value"); // 设置线程本地变量
            System.out.println("Thread 2: " + threadLocal.get()); // 获取线程本地变量
        }).start();
    }
}

以上是 Java JUC 的完整知识点汇总,包含代码示例、实现原理和注意点。如果需要进一步补充或调整,请随时告诉我!

相关推荐
是三好12 天前
并发容器(Collections)
java·多线程·juc
编程、小哥哥13 天前
互联网大厂Java求职面试实录 —— 严肃面试官遇到搞笑水货程序员
java·面试·mybatis·dubbo·springboot·多线程·juc
yb0os113 天前
手写一个简单的线程池
java·开发语言·数据库·计算机·线程池·juc
是三好13 天前
Lock锁
java·juc
abc小陈先生13 天前
JUC并发编程1
java·juc
左灯右行的爱情1 个月前
深入理解 G1 GC:已记忆集合(RSet)与收集集合(CSet)详解
java·jvm·后端·juc
左灯右行的爱情2 个月前
深入学习ReentrantLock
java·后端·juc
fly spider4 个月前
多线程-线程池的使用
java·面试·线程池·多线程·juc
Abelard_4 个月前
JUC--ConcurrentHashMap底层原理
java·开发语言·后端·juc