Java并发编程-04 JUC并发工具类

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.");
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值