Semaphore
Semaphore类是一种JDK内置同步器,用于控制多线程访问公共资源。
信号量可以简单理解为停车场的剩余车位:
- Semaphore semaphore=new Semaphore(6)表示停车场还有6个车位
- semaphore.aquire()表示一辆车现在要进入停车场停车了
- semaphore.release()表示一辆车现在要离开停车场了
- semaphore.aquire(2)表示一辆车现在要进入停车场停车,但要占用两个车位
- semaphore.release(2)表示一辆车现在要离开停车场了,同时要释放出两个车位
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.Semaphore;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.atomic.AtomicInteger;
@Slf4j
public class LearnSemaphore {
public static void main(String[] args) {
//模拟剩余车位数
Semaphore semaphore = new Semaphore(6);
//模拟车辆计数
AtomicInteger CarNumCount = new AtomicInteger(0);
//模拟总共十辆车
for (int i = 0; i < 10; i++) {
new Thread(() -> {
AtomicInteger carNum = new AtomicInteger(CarNumCount.incrementAndGet());
try {
semaphore.acquire();
log.info("{}号车进入停车场,剩余车位:{}", carNum, semaphore.availablePermits());
//模拟随机停车时长
Thread.sleep(ThreadLocalRandom.current().nextInt(1000, 10000));
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
e.printStackTrace();
} finally {
semaphore.release();
log.info("{}号车离开停车场,剩余车位:{}", carNum, semaphore.availablePermits());
}
}).start();
try {
//模拟车辆进入停车场的切换时间
Thread.sleep(10);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
e.printStackTrace();
}
}
}
}