java.utils.concurrent之Semaphore

本文通过一个停车场的例子,详细介绍了Java中Semaphore(信号量)的概念及其使用方法。信号量用于限制多线程环境中对共享资源的访问,确保资源的正确同步。

       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离开停车场了!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值