Java多线程_Semaphore信号量

概念:

Semaphore是信号量,又称为信号灯,它可以控制某个共享资源可被同时访问的次数,即可以维护当前访问某一共享资源的线程个数,并提供了同步机制。
当Semaphore的个数变成1时,即代表只允许一个线程访问,这是Semaphore的功能就变成了Lock的功能。

它有两个核心方法:

  • acquire() 获取一个许可,得到许可才能执行后面的代码,如果没有就等待。
  • release() 释放一个许可。

实例:
给出这样一个实例:现有3个信号量,有6个线程去获取信号量,获取到就执行,没获取到就等待,直到有信号量被释放。

import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

public class SemaphoreDemo implements Runnable {
    Semaphore semaphore = new Semaphore(3);   //创建三个信号量

    @Override
    public void run() {
        try {
            semaphore.acquire();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + "得到一个信号量");
        try {
            Thread.sleep(new Random().nextInt(2000));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        semaphore.release();
        System.out.println(Thread.currentThread().getName() + "释放一个信号量");
    }

    public static void main(String[] args) {
        SemaphoreDemo sd = new SemaphoreDemo();
        ExecutorService service = Executors.newFixedThreadPool(6);
        while (true) {
            service.execute(sd);
        }
    }
}

我们来看一下运行结果:

另外需要注意的一点:
信号灯可以由一个线程使用,然后由另一个线程来进行释放,而锁只能由同一个线程启动和释放,不然就好发生死锁。

猜你喜欢

转载自www.cnblogs.com/ericz2j/p/10295514.html