Semaphore
用来控制同时访问特定资源的线程数量,它通过协调各个线程来保证合理的使用公共资源。
比如马路上要限制流量,只允许同时有100辆车在这条路上行驶,其他的都在路口等待,所以前100辆车会看到绿灯,可以开进这条马路,后面的车会看到红灯,如果100辆中有5辆已经离开马路,那么后面就允许有5辆车驶入马路
Semaphore内部包含公平锁和非公平锁,继承内部类Sync,其中Sync继承AQS。
public class Parking {
private Semaphore semaphore;
public Parking(int limit) {
semaphore = new Semaphore(limit);
}
public void park() {
try {
semaphore.acquire();
long time = (long) (Math.random() * 10);
System.out.println(Thread.currentThread().getName() + "进入停车场停" + time + "秒");
Thread.sleep(time);
System.out.println(Thread.currentThread().getName() + "离开停车场停");
} catch (Exception e) {
} finally {
semaphore.release();
}
}
static class Car extends Thread {
Parking parking;
Car(Parking parking) {
this.parking = parking;
}
@Override
public void run() {
parking.park();
}
}
public static void main(String[] args) {
Parking parking = new Parking(3);
for (int i = 0; i < 5; i++) {
new Car(parking).start();
}
}
}
Thread-0进入停车场停3秒
Thread-1进入停车场停9秒
Thread-2进入停车场停1秒
Thread-2离开停车场停
Thread-3进入停车场停3秒
Thread-0离开停车场停
Thread-4进入停车场停7秒
Thread-3离开停车场停
Thread-1离开停车场停
Thread-4离开停车场停