java基础----Semaphore

  在java中,synchornized和reentrantLock大家肯定很熟悉,但是有些场景,我们一个线程可能需要同时争夺多个资源,这个时候,Semaphore就可以满足这种需求,并且做到限流的效果。

import java.util.Random;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

public class SemaphoneDemo {
    public static void main(String[] args) {
        Semaphore semaphore = new Semaphore(3);
        Random rd = new Random();

        for(int i = 0; i < 6; i++)
        {
            new Thread(()->{
                try {
                    semaphore.acquire();
                    System.out.println(Thread.currentThread().getName() + "获得锁");
                    TimeUnit.SECONDS.sleep(rd.nextInt(10));
                    System.out.println(Thread.currentThread().getName() + "释放锁");
                    semaphore.release();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            },"t"+i).start();
        }
    }
}

  上述代码中,多个线程会同时争夺大小为3的Semaphore锁资源,而当超过3个线程争夺到Semaphore的锁资源,其他线程只能阻塞等待,直到有线程释放资源为止。

原文地址:https://www.cnblogs.com/QicongLiang/p/13652975.html