当一个线程想要访问某个共享资源,首先,它必须获得semaphore。如果semaphore的内部计数器的值大于0,那么semaphore减少计数器的值并允许访问共享的资源。计数器的值大于0表示,有可以自由使用的资源,所以线程可以访问并使用它们。
package aliPay; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; public class SemaphoreTest { public static void main(String[] args) { // TODO Auto-generated method stub ExecutorService service = Executors.newCachedThreadPool(); final Semaphore semaphore = new Semaphore(3);//定义3个信号灯 for(int i=0;i<10;i++){ Runnable runnable = new Runnable() { @Override public void run() { // TODO Auto-generated method stub try { semaphore.acquire();//从信号量中获取一个许可 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("线程"+Thread.currentThread().getName()+"进入 ," + "当前已有"+(3-semaphore.availablePermits())+"个并发"); try { Thread.sleep((long)Math.random()*10000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("线程"+Thread.currentThread().getName()+"即将离开"); semaphore.release(); System.out.println("线程"+Thread.currentThread().getName()+"已离开 ," + "当前已有"+(3-semaphore.availablePermits())+"个并发"); } }; service.execute(runnable); } } }
可修改Semaphores的公平性,在默认的情况下信号量的进入是不公平的。如果在初始化的第二个参数设定为true时,则会选择时间等待最久的一个进入。
public Semaphore(int permits, boolean fair)创建具有给定的许可数和给定的公平设置的 Semaphore。 参数: permits - 初始的可用许可数目。此值可能为负数,在这种情况下,必须在授予任何获取前进行释放。 fair - 如果此信号量保证在争用时按先进先出的顺序授予许可,则为 true;否则为 false。