Semaphore,译为信号量,它的作用就是维护一类可用资源,在多线程环境下保持资源竞争同步的作用。比如,一个停车场,只有三个车位,三个车位就是Semaphore,这时有10辆车要停进来,那么最多只能停进来3辆,其他的车必须等到有车离开停车场才能进去停车。直接来个程序吧。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
public class CarParking implements Runnable {
private static final int POSITION_COUNT = 2;
private int idx;
private Semaphore position;
public static void main(String[] args) {
ExecutorService parkingLot = Executors.newCachedThreadPool();
Semaphore parkingPositions = new Semaphore(3);
for (int i = 0; i < 10; i++) {
parkingLot.submit(new CarParking(i, parkingPositions));
}
parkingLot.shutdown();
}
public void run() {
try {
position.acquire();
pl("车" + idx + "获得一个车位,停好了!");
Thread.sleep((long)Math.random() * 1000);
pl("车" + idx + "离开停车场了!");
position.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public CarParking(int idx, Semaphore position) {
this.idx = idx;
this.position = position;
}
private static void pl(Object o) {
System.out.println(o);
}
}
运行结果如下(不一定相同):
车0获得一个车位,停好了!
车2获得一个车位,停好了!
车1获得一个车位,停好了!
车2离开停车场了!
车1离开停车场了!
车0离开停车场了!
车3获得一个车位,停好了!
车4获得一个车位,停好了!
车4离开停车场了!
车3离开停车场了!
车5获得一个车位,停好了!
车7获得一个车位,停好了!
车6获得一个车位,停好了!
车7离开停车场了!
车5离开停车场了!
车8获得一个车位,停好了!
车6离开停车场了!
车8离开停车场了!
车9获得一个车位,停好了!
车9离开停车场了!
本文通过一个停车场的例子,详细介绍了Java中Semaphore(信号量)的概念及其使用方法。信号量用于限制多线程环境中对共享资源的访问,确保资源的正确同步。
1793

被折叠的 条评论
为什么被折叠?



