1、ReentrantLock
ReentrantLock是一种可重入的互斥锁。
与synchronized相比:
- 可中断
- 可设置为公平锁
- 可设置超时时间
- 支持多个条件变量
- 和Synchronized一样支持重入锁
使用场景:各种并发场景
示例:
ReentrantLock lock = new ReentrantLock();
try {
lock.lock(); // 获取锁
// 执行需要同步的代码
} finally {
lock.unlock(); // 释放锁
}
2、Semaphore
Semaphore是一种控制并发线程数量的工具类。它允许指定同时允许多少个线程访问临界资源。
使用场景:需要限制资源访问的情况下,例如数据库连接池或线程池。
示例:
Semaphore semaphore = new Semaphore(3); // 允许3个线程同时访问
try {
semaphore.acquire(); // 获取许可
// 执行需要控制的代码
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release(); // 释放许可
}
3、CountDownLatch
CountDownLatch是一种同步工具,用于等待一组线程完成后再继续执行主线程。
使用场景:主线程可以通过CountDownLatch等待其他线程完成任务,然后再继续执行。在协调多个线程的工作时非常有用
示例:
CountDownLatch latch = new CountDownLatch(3); // 三个线程完成后继续执行
Runnable worker = () -> {
// 执行任务
latch.countDown(); // 减少计数
};
new Thread(worker).start();
new Thread(worker).start();
new Thread(worker).start();
latch.await(); // 主线程等待三个线程完成
System.out.println("All threads have completed.");
4、CyclicBarrier
CyclicBarrier是一种同步工具,用于等待一组线程相互达到某个屏障点后再一起继续执行。
使用场景:不同于CountDownLatch,CyclicBarrier可以被重复使用,使得多个线程可以协同工作,并在每个屏障点同步等待。
示例:
CyclicBarrier barrier = new CyclicBarrier(3); // 等待三个线程到达屏障
Runnable worker = () -> {
try {
// 执行任务
barrier.await(); // 等待其他线程
} catch (Exception e) {
e.printStackTrace();
}
};
new Thread(worker).start();
new Thread(worker).start();
new Thread(worker).start();
5、Exchanger
Exchanger是一种用于两个线程之间交换数据的同步工具。它允许两个线程在指定的点上交换数据,
使用场景:生产者-消费者问题或线程间协作
示例:
Exchanger<String> exchanger = new Exchanger<>();
Runnable worker = () -> {
try {
String data = "Data from Thread A";
String receivedData = exchanger.exchange(data);
System.out.println("Thread A received: " + receivedData);
} catch (InterruptedException e) {
e.printStackTrace();
}
};
new Thread(worker).start();
Runnable workerB = () -> {
try {
String data = "Data from Thread B";
String receivedData = exchanger.exchange(data);
System.out.println("Thread B received: " + receivedData);
} catch (InterruptedException e) {
e.printStackTrace();
}
};
new Thread(workerB).start();
6、Phaser
Phaser是一种高级的同步工具,用于协调多个线程的执行。可以灵活地管理不定数量的参与者。Phaser提供了多个阶段,允许线程在各个阶段进行同步,以完成任务。
使用场景:多线程批量处理数据、动态添加和删除线程的场景。
示例:
Phaser phaser = new Phaser(3); // 有三个参与者
Runnable worker = () -> {
// 执行任务
phaser.arriveAndAwaitAdvance(); // 同步在此点
};
new Thread(worker).start();
new Thread(worker).start();
new Thread(worker).start();
// 主线程等待所有参与者完成
phaser.awaitAdvance(0);
System.out.println("All threads have completed.");