标签:
Semaphore(信号量)充当了操作系统概念下的“信号量”。它提供了“临界区中可用资源信号量”的相同功能。
以一个停车场运作为例。为了简单起见,假设停车场只有三个车位,一开始三个车位都是空的。这时如果同时来了五辆车,看门人允许其中三辆不受阻碍的进入,然后放下车拦,剩下的车则必须在入口等待,此后来的车也都不得不在入口处等待。这时,有一辆车离开停车场,看门人得知后,打开车拦,放入一辆,如果又离开两辆,则又可以放入两辆,如此往复。
在这个停车场系统中,车位是公共资源(临界区资源),每辆车好比一个线程,看门人起的就是信号量的作用。
更进一步,信号量的特性如下:信号量是一个非负整数(车位数),所有通过它的线程(车辆)都会将该整数减一(通过它当然是为了使用资源),当该整数值为零时,所有试图通过它的线程都将处于等待状态。在信号量上我们定义两种操作: acquire(获取资源) 和 Release(释放资源)。 当一个线程调用acquire(获取资源)操作时,它要么通过然后将信号量减一,要么一直等下去,直到信号量大于一或超时。Release(释放)实际上是在信号量上执行加操作,对应于车辆离开停车场,该操作之所以叫做“释放”是因为加操作实际上是释放了由信号量守护的资源。
package com.lt.thread.SamephoreTest; import java.util.concurrent.Semaphore; /** * Created by ltao on 2015-2-9. */ public class Parking implements Runnable { private int count; private Semaphore semaphore; public int getCount() { return count; } public void setCount(int count) { this.count = count; } public Semaphore getSemaphore() { return semaphore; } public void setSemaphore(Semaphore semaphore) { this.semaphore = semaphore; } public Parking(int count) { this.count=count; this.semaphore=new Semaphore(count); } public void parking() { try { semaphore.acquire(); try { Thread.sleep(100); System.out.println(Thread.currentThread().getName()+" find a paking space"); } catch (InterruptedException e) { e.printStackTrace(); } } catch (InterruptedException e) { e.printStackTrace(); } finally { System.out.println(Thread.currentThread().getName()+" release a paking space"); semaphore.release(); } } @Override public void run() { this.parking(); } public static void main(String[] args) { Parking parking=new Parking(5); Thread[] threads=new Thread[13]; for (int i=0;i<threads.length;i++) { threads[i]=new Thread(parking,"thread"+i); } for (int i=0;i<threads.length;i++) { threads[i].start(); } } }
标签:
原文地址:http://www.cnblogs.com/limingluzhu/p/4325999.html