三个线程交替打印ABC100次问题思考之二,使用信号量的优雅实现

简介: 三个线程交替打印ABC100次问题思考之二,使用信号量的优雅实现

image.png

如题:使用信号量的优雅实现

方法三:使用SemaphoretryAcquire()方法实现线程间的加锁操作

public class PrintAbcBySemaphore {
    /**
     * 循环计数初始值0
     */
    static int count = 0;
    // 定义三个线程对应的信号量A、B、C,默认给A线程一个许可证
    private Semaphore semaphoreA = new Semaphore(1);
    private Semaphore semaphoreB = new Semaphore(0);
    private Semaphore semaphoreC = new Semaphore(0);
    public void print() {
        Thread threadA = new Thread(() -> {
            extracted(semaphoreA, "A", semaphoreB);
        });
        Thread threadB = new Thread(() -> {
            extracted(semaphoreB, "B", semaphoreC);
        });
        Thread threadC = new Thread(() -> {
            extracted(semaphoreC, "C", semaphoreA);
        });
        threadB.start();
        threadC.start();
        try {
            Thread.sleep(2000L);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        threadA.start();
    }
    private void extracted(Semaphore needSemaphore, String A, Semaphore nextSemaphore) {
        while (true) {
            // 当前线程的信号量加锁
            if (needSemaphore.tryAcquire(1)) {
                if (count < 100) {
                    System.out.println(A);
                    count++;
                    // 给下一个待执行线程的信号量加一个许可证
                    nextSemaphore.release();
                } else {
                    // 执行100次后,退出线程
                    nextSemaphore.release();
                    break;
                }
            }
        }
    }
    public static void main(String[] args) {
        new PrintAbcBySemaphore().print();
    }
}

使用SemaphoretryAcquire()方法实现线程间的加锁操作,通过release()方法给下一个待执行线程的信号量添加一个许可证,由此保证三个线程顺序执行,初始化A线程信号量时添加一个默认许可证,让A线程第一个执行

上述方法,通过jucSemaphore类能够比较优雅的达成线程间顺序唤醒,也是笔者认为最优雅的方式,有兴趣可以查看上篇文章比较三种方式实现优缺点 三个线程交替打印ABC100次问题思考


目录
相关文章
|
1月前
|
运维 API 计算机视觉
深度解密协程锁、信号量以及线程锁的实现原理
深度解密协程锁、信号量以及线程锁的实现原理
35 1
|
2月前
|
Java 数据中心 微服务
Java高级知识:线程池隔离与信号量隔离的实战应用
在Java并发编程中,线程池隔离与信号量隔离是两种常用的资源隔离技术,它们在提高系统稳定性、防止系统过载方面发挥着重要作用。
44 0
|
3月前
|
安全 C++
利用信号量实现线程顺序执行
【8月更文挑战第25天】信号量是多线程编程中用于控制共享资源访问的关键同步机制,能有效保证线程按预设顺序执行。实现方法包括:引入相关头文件(如 C++ 中的 `&lt;semaphore.h&gt;`),创建信号量并通过 `sem_init` 设置初始值;在各线程函数中运用 `sem_post` 与 `sem_wait` 来传递执行权;最后,通过 `sem_destroy` 销毁信号量以释放资源。使用过程中需注意错误处理、确保线程安全及合理设定信号量初值,以维持程序稳定性和高效性。
|
3月前
利用信号量实现线程顺序执行
【8月更文挑战第24天】本文介绍了如何运用信号量确保多线程程序中线程按预定顺序执行的方法。信号量作为同步机制,可有效控制共享资源访问,防止数据不一致。实现步骤包括:引入必要的头文件(如 `&lt;pthread.h&gt;` 和 `&lt;semaphore.h&gt;`),定义信号量变量(如 `sem_t` 类型),初始化信号量(通常第一个信号量设为1,其余设为0),以及创建线程(每个线程执行特定任务并释放相应信号量)。
|
3月前
|
数据采集 Java Python
python 递归锁、信号量、事件、线程队列、进程池和线程池、回调函数、定时器
python 递归锁、信号量、事件、线程队列、进程池和线程池、回调函数、定时器
|
4月前
|
监控 Cloud Native Java
通用快照方案问题之Hystrix和Ribbon在超时设置上的冲突如何解决
通用快照方案问题之Hystrix和Ribbon在超时设置上的冲突如何解决
51 0
|
5月前
|
API
java-多线程-CountDownLatch(闭锁) CyclicBarrier(栅栏) Semaphore(信号量)-
java-多线程-CountDownLatch(闭锁) CyclicBarrier(栅栏) Semaphore(信号量)-
34 1
|
6月前
|
安全 Java API
多线程(JUC, ReentrantLock, 原子类, 线程池, 信号量 Semaphore, CountDownLatch)
多线程(JUC, ReentrantLock, 原子类, 线程池, 信号量 Semaphore, CountDownLatch)
55 4
高频面试题:如何分别用三种姿势实现三个线程交替打印0到100
高频面试题:如何分别用三种姿势实现三个线程交替打印0到100
408 0
|
6月前
|
算法 安全 Unix
【C++ 20 信号量 】C++ 线程同步新特性 C++ 20 std::counting_semaphore 信号量的用法 控制对共享资源的并发访问
【C++ 20 信号量 】C++ 线程同步新特性 C++ 20 std::counting_semaphore 信号量的用法 控制对共享资源的并发访问
182 0

热门文章

最新文章

相关实验场景

更多