优化算法
- 线程池
- 原理:使用线程池可以避免频繁创建和销毁线程带来的开销。线程池维护一定数量的线程,任务到达时,从线程池中获取线程执行,执行完毕后线程不销毁而是返回线程池等待下一个任务。
- 示例:Java 提供了
ThreadPoolExecutor
类来创建线程池。例如:
ExecutorService executorService = new ThreadPoolExecutor(
5, // 核心线程数
10, // 最大线程数
10L, TimeUnit.SECONDS, // 线程存活时间
new ArrayBlockingQueue<>(100)); // 任务队列
executorService.submit(() -> {
// 任务逻辑
});
- 减少锁竞争
- 原理:锁是多线程编程中保护共享资源的重要手段,但过多的锁竞争会导致性能下降。可以通过减小锁的粒度,只对关键共享资源加锁;或者采用读写锁(
ReadWriteLock
),允许多个线程同时读,写操作时才独占锁。
- 示例:
ReadWriteLock lock = new ReentrantReadWriteLock();
lock.readLock().lock();
try {
// 读操作
} finally {
lock.readLock().unlock();
}
lock.writeLock().lock();
try {
// 写操作
} finally {
lock.writeLock().unlock();
}
设计模式
- 生产者 - 消费者模式
- 原理:通过一个缓冲区来缓存数据,生产者将数据放入缓冲区,消费者从缓冲区取出数据,从而解耦生产者和消费者的生产和消费速度,提高系统整体效率。
- 示例:
class Buffer {
private int value;
private boolean available = false;
public synchronized void put(int value) {
while (available) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.value = value;
available = true;
notifyAll();
}
public synchronized int get() {
while (!available) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
available = false;
notifyAll();
return value;
}
}
class Producer implements Runnable {
private Buffer buffer;
public Producer(Buffer buffer) {
this.buffer = buffer;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
buffer.put(i);
System.out.println("Produced: " + i);
}
}
}
class Consumer implements Runnable {
private Buffer buffer;
public Consumer(Buffer buffer) {
this.buffer = buffer;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
int value = buffer.get();
System.out.println("Consumed: " + value);
}
}
}
- Future模式
- 原理:在调用一个可能耗时的操作时,立即返回一个
Future
对象,调用者可以继续执行其他任务,之后通过Future
对象获取操作结果。
- 示例:
ExecutorService executorService = Executors.newSingleThreadExecutor();
Future<Integer> future = executorService.submit(() -> {
// 模拟耗时操作
Thread.sleep(2000);
return 42;
});
try {
Integer result = future.get();
System.out.println("Result: " + result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
JVM参数调整
- 调整堆内存大小
- 原理:合适的堆内存大小可以避免频繁的垃圾回收,提高线程执行效率。
-Xms
设置初始堆大小,-Xmx
设置最大堆大小。
- 示例:
java -Xms512m -Xmx1024m YourMainClass
- 垃圾回收器选择
- 原理:不同的垃圾回收器适用于不同的场景。例如,
ParallelGC
适用于多CPU、吞吐量优先的场景;CMS
(Concurrent Mark - Sweep)适用于低延迟场景;G1
(Garbage - First)适用于大堆内存且希望兼顾吞吐量和延迟的场景。
- 示例:使用
ParallelGC
:java -XX:+UseParallelGC YourMainClass
;使用CMS
:java -XX:+UseConcMarkSweepGC YourMainClass
;使用G1
:java -XX:+UseG1GC YourMainClass
。