Java必学,看一眼不吃亏,万一对你有用呢,本文万字解析进程与线程本质,讲解了多线程和高并发的原理,详解synchronized锁升级机制,剖析JUC工具库与线程池异步,结合实时监控,电力调控等高并发场景,提供线程池调优、分布式锁(Redis)等实战方案,贯通原理到工程的全链路知识。
官方定义:
通俗比喻:
进程如同一个独立的银行营业厅,拥有自己的金库(内存)、安保系统(权限)和员工管理规则(环境变量)。不同营业厅(进程)之间转账需要填写正式单据(IPC)。
线程则是营业厅内的多个柜台窗口,共享同一个金库(堆内存)和打印机(I/O设备),但每个柜员(线程)独立处理客户(任务)的业务,有自己的工作台(栈空间)。
官方定义:
高并发是指系统在单位时间内(通常为秒级)能够同时处理大量请求的能力,通常用于描述分布式系统或服务端程序应对海量用户访问的场景。
技术本质:
典型场景:
官方定义:
多线程是指在一个进程内创建多个执行流(线程),共享进程资源(内存、文件句柄等),通过并行或并发执行提升程序效率的编程模型。
技术本质:
典型应用:
维度 | 高并发 | 多线程 |
---|---|---|
关注点 | 系统整体吞吐与稳定性 | 单进程内任务执行效率 |
技术范畴 | 分布式架构、负载均衡、缓存 | 编程模型、CPU调度、线程同步 |
实现手段 | 水平扩展(集群)、异步化、降级 | 线程池、锁、原子操作 |
典型问题 | 雪崩效应、数据库连接池瓶颈 | 死锁、竞态条件、内存可见性问题 |
互补性示例:
线程生命周期:
线程有新建、就绪、运行、阻塞、终止五种状态
缓存一致性协议(MESI):
CPU通过缓存一致性协议保证数据同步
内存屏障(Memory Barrier):
由于编译器和CPU的指令重排序优化,程序执行顺序可能与代码顺序不一致。内存屏障通过限制指令重排序,保证多线程环境下的可见性和有序性:
原子性(Atomicity):
i++
)包含多个步骤(读取、修改、写入),多线程并发时可能被其他线程干扰。synchronized
或ReentrantLock
将临界区代码原子化。AtomicInteger
,基于CAS(Compare-And-Swap)实现无锁原子操作。可见性(Visibility):
volatile
关键字:强制读写直接操作主内存,禁止缓存优化。有序性(Ordering):
volatile
关键字:通过内存屏障禁止重排序。synchronized
:锁内代码禁止重排序。synchronized
的底层实现对象头结构:
每个Java对象在内存中分为三部分:对象头(Header)、实例数据(Instance Data)、对齐填充(Padding)。其中对象头包含:
锁状态与升级过程:
锁升级的意义:
Java代码示例:
public class SynchronizedDemo {
// 实例方法同步
public synchronized void instanceLock() {
// 临界区代码
}
// 代码块同步
public void blockLock() {
synchronized(this) {
// 临界区代码
}
}
}
核心设计:
AQS是JUC中锁和同步器的基石,采用CLH(Craig, Landin, and Hagersten)队列管理等待线程,并通过state
变量表示资源状态。
实现原理:
ReentrantLock
):
tryAcquire
:子类实现资源获取逻辑(如判断state
是否为0)。acquire
:模板方法,依次尝试获取资源、加入队列、阻塞等待。Semaphore
):
tryAcquireShared
:子类实现共享资源的获取逻辑。acquireShared
:模板方法,处理资源获取失败后的排队逻辑。ConcurrentHashMap
的演进:
Segment
,每个段独立加锁,降低锁粒度。synchronized
:仅在哈希桶级别加锁,进一步细化锁粒度。无锁算法的代表:原子类
CAS(Compare-And-Swap):
// Java中的CAS实现(AtomicInteger)
AtomicInteger atomicInt = new AtomicInteger(0);
boolean success = atomicInt.compareAndSet(0, 1); // 期望值0,新值1
AtomicInteger
实现:
Unsafe
类调用CPU指令实现原子操作。Java代码示例:
public class AtomicCounter {
private AtomicInteger count = new AtomicInteger(0);
public void increment() {
count.incrementAndGet();
}
public int getCount() {
return count.get();
}
}
参数解析:
SynchronousQueue
:无容量队列,每个插入操作必须等待一个删除操作。LinkedBlockingQueue
:无界队列(默认容量Integer.MAX_VALUE
),可能导致OOM。ArrayBlockingQueue
:有界队列,需指定固定容量。工作流程:
拒绝策略:
AbortPolicy
:默认策略,直接抛出RejectedExecutionException
。CallerRunsPolicy
:由提交任务的线程直接执行任务(同步执行)。DiscardPolicy
:静默丢弃被拒绝的任务。DiscardOldestPolicy
:丢弃队列中最旧的任务,重新提交当前任务。Java代码示例:
ExecutorService executor = new ThreadPoolExecutor(
4, // corePoolSize
8, // maximumPoolSize
60, TimeUnit.SECONDS,
new ArrayBlockingQueue<>(100),
new ThreadPoolExecutor.CallerRunsPolicy()
);
executor.submit(() -> System.out.println("Task executed"));
executor.shutdown();
CompletableFuture
与响应式编程链式调用模型:
CompletableFuture
通过thenApply
、thenAccept
等方法实现任务的流水线处理,支持:
ForkJoinPool
或自定义线程池执行任务。exceptionally
捕获并处理异常。Future
的结果(如thenCombine
)。Java代码示例:
CompletableFuture.supplyAsync(() -> "Hello")
.thenApplyAsync(s -> s + " World")
.thenAcceptAsync(System.out::println)
.exceptionally(ex -> {
System.out.println("Error: " + ex.getMessage());
return null;
});
Redis分布式锁:
SET key value NX EX timeout
(原子性设置键值并指定超时)。隔离级别与锁机制:
诊断工具:
monitor
命令统计方法调用耗时和锁竞争情况。优化策略:
ConcurrentHashMap
的分段锁)。ReadWriteLock
提升读多写少场景的性能。Disruptor
环形队列,通过内存填充避免伪共享(False Sharing)。Java代码示例:
public class ReadWriteLockDemo {
private ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
public void read() {
rwLock.readLock().lock();
try {
// 读操作
} finally {
rwLock.readLock().unlock();
}
}
public void write() {
rwLock.writeLock().lock();
try {
// 写操作
} finally {
rwLock.writeLock().unlock();
}
}
}
监控指标:
动态调参:
Java代码示例:
public class DynamicThreadPool {
private ThreadPoolExecutor executor;
public void adjustCorePoolSize(int newCoreSize) {
if (newCoreSize < 0 || newCoreSize > executor.getMaximumPoolSize()) {
throw new IllegalArgumentException();
}
executor.setCorePoolSize(newCoreSize);
}
}
技术背景:
电力数据解析需实现毫秒级延迟,传统BlockingQueue
在高并发下性能骤降。
Disruptor核心机制:
BlockingWaitStrategy
平衡吞吐与延迟。Java代码示例:
// 定义事件类
public class LogEvent {
private String message;
// getter/setter
}
// 初始化Disruptor
Disruptor<LogEvent> disruptor = new Disruptor<>(
LogEvent::new,
1024,
DaemonThreadFactory.INSTANCE,
ProducerType.MULTI,
new BlockingWaitStrategy()
);
// 绑定消费者
disruptor.handleEventsWith((event, sequence, endOfBatch) ->
System.out.println("Process: " + event.getMessage()));
// 生产数据
RingBuffer<LogEvent> ringBuffer = disruptor.start();
long sequence = ringBuffer.next();
LogEvent event = ringBuffer.get(sequence);
event.setMessage("Power Data: Voltage=220V");
ringBuffer.publish(sequence);
优化效果:
背景:
在电力监控系统中,需实时采集数千个电表数据(每秒万级数据包)。采用Netty的Reactor线程模型解决高并发网络通信问题。
核心设计:
Java代码示例:
// Netty服务端配置
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup(8);
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) {
// 添加协议解码器(解决TCP粘包)
ch.pipeline().addLast(new LengthFieldBasedFrameDecoder(1024, 0, 2));
// 业务处理交给独立线程池
ch.pipeline().addLast(new ThreadPoolHandler(customThreadPool));
}
});
优化效果:
背景:
电力数据需持久化到MySQL,传统逐条插入导致性能瓶颈。
优化方案:
Java代码示例:
// MyBatis批量插入配置
@Bean
public SqlSessionFactory sqlSessionFactory() {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
// 启用Batch模式
factoryBean.setExecutorType(ExecutorType.BATCH);
return factoryBean.getObject();
}
// JDBC URL添加参数
jdbc:mysql://localhost:3306/power_db?rewriteBatchedStatements=true
性能对比:
背景:
多节点部署的监控服务需竞争设备控制权,防止重复下发指令。
技术选型:
Java代码示例:
public class RedisLock {
private static final String LOCK_SCRIPT =
"if redis.call('setnx', KEYS[1], ARGV[1]) == 1 then " +
" redis.call('pexpire', KEYS[1], ARGV[2]) " +
" return 1 " +
"else return 0 end";
public boolean tryLock(String key, String value, long expireMs) {
Object result = jedis.eval(LOCK_SCRIPT, Collections.singletonList(key),
Arrays.asList(value, String.valueOf(expireMs)));
return result.equals(1L);
}
// 锁续期
public void renewLock(String key, String value, long expireMs) {
String script = "if redis.call('get', KEYS[1]) == ARGV[1] then " +
" return redis.call('pexpire', KEYS[1], ARGV[2]) " +
"else return 0 end";
jedis.eval(script, Collections.singletonList(key),
Arrays.asList(value, String.valueOf(expireMs)));
}
}
应用效果:
synchronized
,CAS替代悲观锁。