Skip to content

JUC 简介 ​

什么是JUC? ​

JUC(java.util.concurrent)是Java并发编程工具包,提供了丰富的并发编程工具类。

主要内容 ​

1. 线程基础 ​

  • Thread类与Runnable接口
  • 线程的生命周期
  • 线程的创建与启动

2. 并发工具 ​

  • Lock接口:比synchronized更灵活的锁机制
  • 线程池:管理和复用线程
  • 并发容器:线程安全的集合类
  • 同步工具:CountDownLatch、CyclicBarrier、Semaphore等

3. 原子类 ​

提供无锁的线程安全操作:

  • AtomicInteger
  • AtomicLong
  • AtomicReference

为什么需要JUC? ​

传统synchronized的局限 ​

java
// synchronized的局限性
synchronized(obj) {
    // 1. 无法中断等待
    // 2. 无法设置超时
    // 3. 无法实现公平锁
}

JUC的优势 ​

java
// ReentrantLock提供更多功能
Lock lock = new ReentrantLock();
try {
    lock.lock();
    // 业务代码
} finally {
    lock.unlock();
}

// 可中断、可超时、可公平
if (lock.tryLock(1, TimeUnit.SECONDS)) {
    try {
        // 业务代码
    } finally {
        lock.unlock();
    }
}

JUC核心组件 ​

1. Executor框架 ​

java
ExecutorService executor = Executors.newFixedThreadPool(5);
executor.submit(() -> {
    System.out.println("任务执行");
});
executor.shutdown();

2. Lock接口 ​

java
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();

3. 并发容器 ​

java
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
BlockingQueue<String> queue = new LinkedBlockingQueue<>();

4. 原子操作类 ​

java
AtomicInteger count = new AtomicInteger(0);
count.incrementAndGet();  // 原子自增
count.compareAndSet(1, 2);  // CAS操作

5. 同步工具类 ​

java
// CountDownLatch:倒计时门闩
CountDownLatch latch = new CountDownLatch(3);
latch.countDown();
latch.await();

// CyclicBarrier:循环屏障
CyclicBarrier barrier = new CyclicBarrier(3);
barrier.await();

// Semaphore:信号量
Semaphore semaphore = new Semaphore(3);
semaphore.acquire();
semaphore.release();

并发编程三大特性 ​

1. 原子性(Atomicity) ​

操作不可分割,要么全部执行,要么全不执行。

java
AtomicInteger i = new AtomicInteger(0);
i.incrementAndGet();  // 原子操作

2. 可见性(Visibility) ​

一个线程修改的共享变量,其他线程能立即看到。

java
volatile int count = 0;  // 保证可见性

3. 有序性(Ordering) ​

程序执行的顺序按照代码的先后顺序执行。

java
// volatile禁止指令重排序
volatile boolean flag = false;

线程安全问题示例 ​

问题代码 ​

java
public class Counter {
    private int count = 0;
    
    public void increment() {
        count++;  // 非原子操作,线程不安全
    }
}

解决方案 ​

java
// 方案1:synchronized
public synchronized void increment() {
    count++;
}

// 方案2:Lock
private Lock lock = new ReentrantLock();
public void increment() {
    lock.lock();
    try {
        count++;
    } finally {
        lock.unlock();
    }
}

// 方案3:原子类
private AtomicInteger count = new AtomicInteger(0);
public void increment() {
    count.incrementAndGet();
}

💡 提示

这是一个demo文档,欢迎补充更多JUC相关内容。

深入学习 ​

基于 VitePress 构建