Semaphore是jdk用以控制线程并发数的工具,主要以acquire()与release()成对使用
acquire 获取运行令牌,没有则阻塞当前线程直到获取到
release 释放令牌
public class Demo {
public static void main(String[] args) {
Semaphore se = new Semaphore(2);
List<String> list = new ArrayList<>();
for(int i =0; i < 10;i++) {
int t = i;
new Thread(()->{
try {
se.acquire();
list.add("线程" + t);
System.out.println(Arrays.toString(list.toArray()));
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
list.remove("线程" + t);
se.release();
}).start();
}
}
}
运行结果:
[线程0]
[线程0, 线程1]
[线程3]
[线程3, 线程2]
[线程6]
[线程6, 线程5]
[线程5, 线程4]
[线程4, 线程7]
[线程8]
[线程8, 线程9]
Semaphore代码结构如图,有跟ReentrantLock一样有公平锁非公平锁,默认为非公平竞争
并且jdk提供了tryAcquire()方法进行快速尝试获取令牌,以加大代码灵活性