学习多线程之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工具类来声明出两个信号量,并且使用三个线程来同时执行,每一个线程都独自占用一个信号量,这就会导致只有两个线程可以同时进行,第三个线程就只能等待其他线程执行完成才行。

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

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


相关文章
|
2月前
|
数据可视化 关系型数据库 编译器
【C/C++ 单线程性能分析工具 Gprof】 GNU的C/C++ 性能分析工具 Gprof 使用全面指南
【C/C++ 单线程性能分析工具 Gprof】 GNU的C/C++ 性能分析工具 Gprof 使用全面指南
413 2
|
5天前
|
安全 Java 调度
Java面试题:Java内存优化、多线程安全与并发框架实战,如何在Java应用中实现内存优化?在多线程环境下,如何保证数据的线程安全?使用Java并发工具包中的哪些工具可以帮助解决并发问题?
Java面试题:Java内存优化、多线程安全与并发框架实战,如何在Java应用中实现内存优化?在多线程环境下,如何保证数据的线程安全?使用Java并发工具包中的哪些工具可以帮助解决并发问题?
7 0
|
1月前
|
API
java-多线程-CountDownLatch(闭锁) CyclicBarrier(栅栏) Semaphore(信号量)-
java-多线程-CountDownLatch(闭锁) CyclicBarrier(栅栏) Semaphore(信号量)-
18 1
|
17天前
|
NoSQL Redis
Redis系列学习文章分享---第五篇(Redis实战篇--优惠券秒杀,全局唯一id 添加优惠券 实现秒杀下单 库存超卖问题分析 乐观锁解决超卖 实现一人一单功能 集群下的线程并发安全问题)
Redis系列学习文章分享---第五篇(Redis实战篇--优惠券秒杀,全局唯一id 添加优惠券 实现秒杀下单 库存超卖问题分析 乐观锁解决超卖 实现一人一单功能 集群下的线程并发安全问题)
23 0
|
19天前
|
调度 Python
Python多线程学习优质方法分享
Python多线程学习优质方法分享
12 0
|
21天前
|
安全 API C++
逆向学习Windows篇:C++中多线程的使用和回调函数的实现
逆向学习Windows篇:C++中多线程的使用和回调函数的实现
14 0
|
2月前
|
安全 Java API
多线程(JUC, ReentrantLock, 原子类, 线程池, 信号量 Semaphore, CountDownLatch)
多线程(JUC, ReentrantLock, 原子类, 线程池, 信号量 Semaphore, CountDownLatch)
34 4
|
2月前
|
Java 调度
【JAVA学习之路 | 提高篇】进程与线程(Thread)
【JAVA学习之路 | 提高篇】进程与线程(Thread)
|
2月前
|
Java
Java一分钟之-并发编程:线程间通信(Phaser, CyclicBarrier, Semaphore)
【5月更文挑战第19天】Java并发编程中,Phaser、CyclicBarrier和Semaphore是三种强大的同步工具。Phaser用于阶段性任务协调,支持动态注册;CyclicBarrier允许线程同步执行,适合循环任务;Semaphore控制资源访问线程数,常用于限流和资源池管理。了解其使用场景、常见问题及避免策略,结合代码示例,能有效提升并发程序效率。注意异常处理和资源管理,以防止并发问题。
44 2
|
1月前
|
Java
Java线程学习经典例子-读写者演示
Java线程学习经典例子-读写者演示
16 0