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的锁资源,其他线程只能阻塞等待,直到有线程释放资源为止。