写在前面
今天我们来学习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工具类来声明出两个信号量,并且使用三个线程来同时执行,每一个线程都独自占用一个信号量,这就会导致只有两个线程可以同时进行,第三个线程就只能等待其他线程执行完成才行。
通过运行的结果,我们也得到了预想中的效果。
前两个线程因为信号量充足,所以没有等待就直接运行了,所以得到的时间毫秒值是一样的,但是第三个线程就不是这样了,由于需要等待,所以执行的时间晚了些。