学习多线程之Semaphore工具解释

简介: 学习多线程之Semaphore工具解释

写在前面


今天我们来学习Semaphore计数信号量的多线程同步工具。

从这个工具中,我们可以不再是简单的使用synchronize关键字来实现同步锁,还可以通过这个工具做一些其他的工作。算的上是一些多线程的进阶知识了。

下面就一起来看一下吧。


学习多线程之Semaphore工具解释


Semaphore是多线程中一个身为计数信号量的一个工具,使用这个工具类,可以做到限流的效果,当然也可以做到同步锁的作用。

主要提供的功能就是,多个线程同时获取信号量,并且在获得信号量之后才可以继续运行,否则只能原地等待其他线程运行完成,有空闲之后方可运行。

让我们来看一下相关的示例吧,如下代码所示:


public static void main(String[] args) {
    Semaphore semaphore = new Semaphore(2);
    Thread thread0 = new Thread(new Runnable() {
        @SneakyThrows
        @Override
        public void run() {
            semaphore.acquire();
            System.out.println(System.currentTimeMillis());
            semaphore.release();
        }
    });
    Thread thread1 = new Thread(new Runnable() {
        @SneakyThrows
        @Override
        public void run() {
            semaphore.acquire();
            System.out.println(System.currentTimeMillis());
            semaphore.release();
        }
    });
    Thread thread2 = new Thread(new Runnable() {
        @SneakyThrows
        @Override
        public void run() {
            semaphore.acquire();
            System.out.println(System.currentTimeMillis());
            semaphore.release();
        }
    });
    thread0.start();
    thread1.start();
    thread2.start();
}


先来看一下这段代码的执行结果吧,大家也可以自行去试一下。

1645860909908

1645860909908

1645860909936

这段代码并不难懂,使用Semaphore工具类来声明出两个信号量,并且使用三个线程来同时执行,每一个线程都独自占用一个信号量,这就会导致只有两个线程可以同时进行,第三个线程就只能等待其他线程执行完成才行。

通过运行的结果,我们也得到了预想中的效果。

前两个线程因为信号量充足,所以没有等待就直接运行了,所以得到的时间毫秒值是一样的,但是第三个线程就不是这样了,由于需要等待,所以执行的时间晚了些。


相关文章
|
27天前
|
安全 程序员 API
|
1月前
|
存储 安全 UED
多线程在打包工具中的运用
【11月更文挑战第2天】本文介绍了多线程技术在打包工具中的应用,包括提高打包效率、优化用户体验和多线程安全考虑。通过并行处理文件和加速资源收集,多线程可以显著缩短打包时间。在用户体验方面,多线程使界面保持响应,并支持优先级处理。此外,文章还讨论了资源访问冲突和死锁预防的解决方案,确保多线程环境下的稳定性和安全性。
|
2月前
|
Java C++
【多线程】JUC的常见类,Callable接口,ReentranLock,Semaphore,CountDownLatch
【多线程】JUC的常见类,Callable接口,ReentranLock,Semaphore,CountDownLatch
34 0
|
3月前
|
监控 Java 调度
【Java学习】多线程&JUC万字超详解
本文详细介绍了多线程的概念和三种实现方式,还有一些常见的成员方法,CPU的调动方式,多线程的生命周期,还有线程安全问题,锁和死锁的概念,以及等待唤醒机制,阻塞队列,多线程的六种状态,线程池等
159 6
【Java学习】多线程&JUC万字超详解
|
6月前
|
API
java-多线程-CountDownLatch(闭锁) CyclicBarrier(栅栏) Semaphore(信号量)-
java-多线程-CountDownLatch(闭锁) CyclicBarrier(栅栏) Semaphore(信号量)-
37 1
|
5月前
|
安全 Java 调度
Java面试题:Java内存优化、多线程安全与并发框架实战,如何在Java应用中实现内存优化?在多线程环境下,如何保证数据的线程安全?使用Java并发工具包中的哪些工具可以帮助解决并发问题?
Java面试题:Java内存优化、多线程安全与并发框架实战,如何在Java应用中实现内存优化?在多线程环境下,如何保证数据的线程安全?使用Java并发工具包中的哪些工具可以帮助解决并发问题?
65 0
|
7月前
|
安全 Java API
多线程(JUC, ReentrantLock, 原子类, 线程池, 信号量 Semaphore, CountDownLatch)
多线程(JUC, ReentrantLock, 原子类, 线程池, 信号量 Semaphore, CountDownLatch)
58 4
|
6月前
|
NoSQL Redis
Redis系列学习文章分享---第五篇(Redis实战篇--优惠券秒杀,全局唯一id 添加优惠券 实现秒杀下单 库存超卖问题分析 乐观锁解决超卖 实现一人一单功能 集群下的线程并发安全问题)
Redis系列学习文章分享---第五篇(Redis实战篇--优惠券秒杀,全局唯一id 添加优惠券 实现秒杀下单 库存超卖问题分析 乐观锁解决超卖 实现一人一单功能 集群下的线程并发安全问题)
130 0
|
6月前
|
调度 Python
Python多线程学习优质方法分享
Python多线程学习优质方法分享
26 0
|
6月前
|
安全 API C++
逆向学习Windows篇:C++中多线程的使用和回调函数的实现
逆向学习Windows篇:C++中多线程的使用和回调函数的实现
196 0