Semaphore 信号量
位于java.lang.concurrent包下
——计数器大于0 表示可以使用的资源数量 小于等于0不可使用
——可用于设置多个并发量,例如限制10个访问
——acquire 获取 release 释放
比Lock更进一步 可以控制多个线程同时访问关键区
实例演示:抢车位
10辆车同时到达停车场,但是只有5个车位,模拟多辆车停车,开走等流程
采用信号量表示资源数目,多线程并发抢占资源
private final Semaphore placeSemaphore=new Semaphore(5);
public boolean parking() throws InterruptedException
{
if(placeSemaphore.tryAcquire())
{
System.out.println(Thread.currentThread().getName()+":停车成功");
return true;
}
else
{
System.out.println(Thread.currentThread().getName()+":没有空位");
return false;
}
}
public void leaving() throws InterruptedException
{
placeSemaphore.release();
System.out.println(Thread.currentThread().getName()+":开走");
}
初始化响应线程,并执行
public static void main(String[] args) throws InterruptedException{
// TODO Auto-generated method stub
int tryToParkCnt=10;//10辆车同时抢车位
SemaphoreExample semaphoreExample=new SemaphoreExample();
Thread[] parkers=new Thread[tryToParkCnt];
for(int i=0;i<tryToParkCnt;i++)
{
parkers[i]=new Thread(
new Runnable()
{
@Override
public void run()
{
try
{
long randomTime=(long)(Math.random()*1000);
Thread.sleep(randomTime);
if(semaphoreExample.parking()) //获取资源 抢夺信号量
{
long parkingTime=(long)(Math.random()*1000);
Thread.sleep(parkingTime);
semaphoreExample.leaving();//调用release释放信号量
}
}catch(InterruptedException e)
{
e.printStackTrace();
}
}
}
);
parkers[i].start();
}
for(int i=0;i<tryToParkCnt;i++)
{
parkers[i].join();
}
}
执行结果