学习多线程之Semaphore工具解释

117 阅读2分钟

「这是我参与2022首次更文挑战的第25天,活动详情查看:2022首次更文挑战

写在前面

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

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

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