java如何处理高并发
处理高并发的方法
使用线程池
通过线程池管理线程资源,避免频繁创建和销毁线程的开销。Java提供了ExecutorService框架,推荐使用ThreadPoolExecutor自定义线程池参数。例如:
ExecutorService executor = Executors.newFixedThreadPool(10); // 固定大小线程池
executor.submit(() -> { /* 任务逻辑 */ });
优化锁机制
减少锁竞争是提升并发性能的关键。使用ReentrantLock替代synchronized,支持公平锁和尝试锁。对于读多写少的场景,采用ReadWriteLock分离读写锁。例如:
ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
lock.readLock().lock(); // 读锁不互斥
lock.writeLock().lock(); // 写锁独占
无锁编程
利用CAS(Compare-And-Swap)原子操作实现无锁并发。Java的AtomicInteger、AtomicReference等类基于Unsafe类实现。例如:
AtomicInteger counter = new AtomicInteger(0);
counter.incrementAndGet(); // 线程安全的自增
分布式与缓存方案
引入消息队列
通过RabbitMQ、Kafka等消息队列异步处理请求,削峰填谷。生产者将请求放入队列,消费者异步处理,避免系统过载。例如Kafka生产者示例:
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
Producer<String, String> producer = new KafkaProducer<>(props);
producer.send(new ProducerRecord<>("topic", "key", "value"));
多级缓存策略
结合本地缓存(如Caffeine)和分布式缓存(如Redis)减少数据库压力。例如使用Caffeine:
Cache<String, Object> cache = Caffeine.newBuilder()
.maximumSize(10_000)
.expireAfterWrite(5, TimeUnit.MINUTES)
.build();
cache.put("key", value); // 线程安全的缓存操作
数据库优化
分库分表
水平拆分数据到多个库或表,降低单表压力。配合ShardingSphere等中间件实现透明化分片。配置示例:
spring:
shardingsphere:
datasource:
names: ds0,ds1
sharding:
tables:
user:
actual-data-nodes: ds$->{0..1}.user_$->{0..15}
连接池调优
使用高性能连接池如HikariCP,合理配置maximumPoolSize、connectionTimeout等参数。例如:
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/db");
config.setMaximumPoolSize(20);
HikariDataSource ds = new HikariDataSource(config);
异步与非阻塞
CompletableFuture
利用Java8的CompletableFuture实现异步编排,避免线程阻塞。例如:
CompletableFuture.supplyAsync(() -> fetchData())
.thenApply(data -> process(data))
.exceptionally(ex -> handleError(ex));
响应式编程
采用Reactor或RxJava实现非阻塞IO。Spring WebFlux示例:
@GetMapping("/flux")
public Flux<String> getFlux() {
return Flux.just("A", "B", "C")
.delayElements(Duration.ofSeconds(1));
}
限流与熔断
RateLimiter
使用Guava的限流工具控制QPS,防止突发流量击穿系统。例如:
RateLimiter limiter = RateLimiter.create(100.0); // 每秒100个许可
if (limiter.tryAcquire()) {
processRequest();
}
熔断降级
通过Resilience4j或Hystrix实现故障隔离。Resilience4j示例:
CircuitBreaker circuitBreaker = CircuitBreaker.ofDefaults("backendService");
Supplier<String> decorated = CircuitBreaker
.decorateSupplier(circuitBreaker, () -> riskyCall());






