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相关内容。