zoukankan      html  css  js  c++  java
  • 信号量

    简介

    • 信号量,有时也被称为信号灯,是多线程模式下使用的一种设施,确保资源正确且合理的使用。

    概念

    • 分为两种,单值和多值,前者只能被一个线程获得,后者可以被多个线程获得
    • 比如一个停车场,里面有三个停车位,这时来了五辆车,这时看门人只允许其中的三辆车进入,剩余的等待,在这里,车位属于资源,车辆属于线程,看门人就属于信号量,其中有等待和释放这两个操作,一次进入一个车辆,如果车位已满,则其他车辆进入等待状态,直至有车出去,释放停车位资源。
    • java提供公平和非公平二种模式,公平是按顺序执行,不公平则有可能后面的排在队列头部前面,Semaphore(int permits, boolean fair),创建指定许可书和公平模式的Semaphore。
    • Semaphore在多线程的情况下被扩放使用,在操作系统中是一个比较重要的概念,java并发库Semaphore可以轻松对信号量的控制,Semaphore可以控制某个公共资源同时被访问的个数,通过acquire()获取一个许可,通过release()释放。单个信号量Semaphore控制可用于互斥锁,由一个线程获得锁,再由另一个线程释放锁,可用于恢复死锁的一些场合。
    • 示例:
    /**
     * 信号量
     * @author 98543
     */
    public class SignTest {
    
    	public static void main(String[] args) {
    		// 穿件线程池
    		ExecutorService es = Executors.newCachedThreadPool();
    		// 创建信号量,只允许5个线程通行
    		final Semaphore sh = new Semaphore(5,true);
    		for (int i = 0; i < 100; i++) {
    			int no = i;
    			Runnable run = new Runnable() {
    				public void run() {
    					try {
    						// 获取允许
    						sh.acquire();
    						System.out.println("No->"+no);
    						Thread.sleep((long) (Math.random()*1000));
    						// 释放
    						sh.release();
    						// sh.availablePermits() 获取可用信号灯数
    						System.out.println("---------------------"+sh.availablePermits());
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					}
    					
    				}
    			};
    			es.submit(run);
    		}
    		es.shutdown();
    	}
    }
    
  • 相关阅读:
    [恢]hdu 1412
    [恢]hdu 2212
    [恢]hdu 1407
    [恢]hdu 1228
    [恢]hdu 1337
    [恢]hdu 1014
    [恢]hdu 2200
    定居到博客园了!
    比较GridView,DataList,Repeator ,DetailsView,FormView
    随手记录修改某条记录时,不使用数据库控件而用datareader
  • 原文地址:https://www.cnblogs.com/kungFuPander/p/11711717.html
Copyright © 2011-2022 走看看