Semaphore 可实现限流,最多允许多少线程同时运行
限制线程访问,如停车场有10个车位即Semaphore semaphore = new Semaphore(10);
进来一辆车(线程),调用acquire方法,如果该线程调用release方法(开走了),释放锁(释放车位)
依此类推,如果车位满了(线程为10),外面的线程等待(等车位),等待分为公平等待和非公平等待(公平锁和非公平锁,可在构造方法设置)
底层依赖AQS的状态State
Semaphore主要目的:
1:多共享线程互斥
2:并发线程数量控制
例:
package com.example.demo;
import java.util.concurrent.Semaphore;
public class Test0425Semaphore {
static Semaphore semaphore = new Semaphore(10);
public void m1(){
try {
semaphore.acquire();
Thread.sleep(1000);
System.out.println("executor m1!!"+ Thread.currentThread().getName());
}catch (Exception e){
e.printStackTrace();
}finally {
semaphore.release();
}
}
public static void main(String[] args) throws InterruptedException {
Test0425Semaphore t = new Test0425Semaphore();
for (int i = 0; i < 10; i++) {
new Thread(t::m1).start();
}
}
}
打印结果10个线程同时进行,如将线程数调整为20个,将分为两批次执行。
semaphore是不可重入的,例子:
线程池的长度为25,semaphore的容量为5,在m1里调用了m2,当执行完前5个线程的时候,发生了死锁。
线程池和semaphore搭配使用,线程池是帮我们创建线程的,semaphore是对线程限流的,如果线程池核心线程数大于semaphore容量,那么将限制线程池的执行数量,例子: