1.概述
信号量主要用于两个目的:
- 一个用于多个共享资源的互斥使用
- 当有多个共享资源(如停车位只有3个),多个线程(6辆车)都要进行抢夺,同一时间,只有3个线程能抢到锁,其他线程阻塞等待,当有线程执行完释放锁,阻塞等待的线程再次抢夺锁
- 另一个用于并发线程数的控制
2.使用案例
使用案例:
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
public class SemaphoreDemo {
/**
* 模拟抢车位:6辆车,抢3个车位
*/
public static void main(String[] args) {
Semaphore semaphore = new Semaphore(3); //模拟3个车位
for (int i = 0; i < 6; i++) {
new Thread(()->{
try {
//强到车位
semaphore.acquire();
System.out.println(Thread.currentThread().getName()+"\t抢到了车位");
//模拟停车3s
TimeUnit.SECONDS.sleep(3);
System.out.println(Thread.currentThread().getName()+"\t停车3s后离开车位");
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
//停了3s后离开车位
semaphore.release();
}
},String.valueOf(i)).start();
}
}
}
3.源码分析