Java并发编程核心机制解析
一、线程基础与生命周期
1.1 线程创建方式
Java提供两种基础线程创建方式:
// 继承Thread类
class MyThread extends Thread {
public void run() {
System.out.println("Thread方式创建");
}
}
// 实现Runnable接口
class MyRunnable implements Runnable {
public void run() {
System.out.println("Runnable方式创建");
}
}
// 启动线程
new MyThread().start();
new Thread(new MyRunnable()).start();
1.2 线程状态转换
线程生命周期包含6种状态:
- NEW:创建未启动
- RUNNABLE:可运行状态
- BLOCKED:等待监视器锁
- WAITING:无限期等待
- TIMED_WAITING:限期等待
- TERMINATED:终止状态
二、同步控制机制
2.1 synchronized关键字
// 同步方法
public synchronized void increment() {
count++;
}
// 同步代码块
public void update() {
synchronized(this) {
// 临界区代码
}
}
2.2 volatile变量
private volatile boolean flag = false;
保证可见性与禁止指令重排,但不保证原子性
三、锁机制演进
3.1 ReentrantLock
Lock lock = new ReentrantLock();
public void performAction() {
lock.lock();
try {
// 临界区操作
} finally {
lock.unlock();
}
}
支持公平锁、可中断获取锁等特性
3.2 读写锁
ReadWriteLock rwLock = new ReentrantReadWriteLock();
Lock readLock = rwLock.readLock();
Lock writeLock = rwLock.writeLock();
实现读共享、写独占的访问控制
四、并发集合框架
4.1 ConcurrentHashMap
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.computeIfAbsent("key", k -> 1);
采用分段锁技术实现高效并发访问
4.2 BlockingQueue
BlockingQueue<String> queue = new LinkedBlockingQueue<>(10);
// 生产者
queue.put("data");
// 消费者
String data = queue.take();
实现生产者-消费者模式的线程安全队列
五、线程池管理
5.1 Executor框架
ExecutorService executor = Executors.newFixedThreadPool(4);
executor.submit(() -> {
System.out.println("Task executed");
});
executor.shutdown();
5.2 核心参数配置
new ThreadPoolExecutor(
4, // 核心线程数
8, // 最大线程数
60, // 空闲时间
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(100) // 任务队列
);
六、原子操作类
6.1 AtomicInteger
AtomicInteger counter = new AtomicInteger(0);
counter.incrementAndGet();
基于CAS实现无锁线程安全操作
6.2 LongAdder
LongAdder adder = new LongAdder();
adder.add(10);
分段累加解决高并发场景下的性能问题
结语
掌握Java并发编程需要深入理解内存可见性、原子性、有序性三大特性。建议通过以下方式提升:
- 使用
java.util.concurrent
工具类替代手动同步 - 优先选择不可变对象
- 合理使用线程池管理资源
- 使用
jstack
等工具进行死锁检测
通过本文的同步原语、并发集合、线程池等核心组件的配合使用,开发者可以构建出高效稳定的并发系统。注意避免过度同步导致的性能损耗,同时警惕资源竞争引发的数据不一致问题。