美文网首页
Java并发——Semaphore信号量

Java并发——Semaphore信号量

作者: 耳_总 | 来源:发表于2017-10-27 17:46 被阅读80次

    Semephore类是java.util.concurrent包下处理并发的工具类,Semephore能够控制任务访问资源的数量,如果资源不够,则任务阻塞,等待其他资源的释放。
    比如一个停车场有三个车位,当车位空余数量小于3时,车辆可以进入停车场停车。如果停车场已经没有了空余车位,后面来的车就不能进入停车场,只能在停车场外等待,等其他车辆离开之后才能进入。

    Semephore类的主要方法
    • 构造方法:
      Semaphore(int permits)
      Semaphore(int permits, boolean fair)
      有两个构造方法,第一个参数表示可以同时访问资源的最大任务数,第二个是个boolean类型,表示是否公平锁。
      公平锁和非公平锁:程序在执行并发任务的时候,拿到同步锁的任务执行代码,其他任务阻塞等待,一旦同步锁被释放,CPU会正在等待的任务分配资源,获取同步锁。在这里又两种策略,CPU默认从等待的任务中随机分配,这是非公平锁;公平锁是按照等待时间优先级来分配,等待的时间越久,先获取任务锁。其内部是一个同步列队实现的。

    • 主要方法
      acquire();获取许可,Semephore任务数加一
      release();释放许可,Semephore任务数减一
      还有几个方法如tryAcquire()尝试获取许可,返回boolean值,不阻塞。availablePermits()还剩几个任务许可,等等几个方法和Lock类的用法相似。

    • 代码示例:

    public static void main(String[] args) {
            Semaphore semaphore = new Semaphore(3);
            ExecutorService exec = Executors.newCachedThreadPool();
            for (int i = 0; i < 10; i++) {
                exec.execute(new Task(semaphore));
            }
    //      semaphore.acquireUninterruptibly(3);
            exec.shutdown();
        }
        
        public static class Task implements Runnable {
    
            private Semaphore semaphore;
    
            public Task(Semaphore semaphore) {
                this.semaphore = semaphore;
            }
            
            @Override
            public void run() {
                try {
                    semaphore.acquire();
                    System.out.println(Thread.currentThread().getName() + "获取了资源");
                    TimeUnit.SECONDS.sleep(1);
                    System.out.println(Thread.currentThread().getName() + "准备释放资源");
                    semaphore.release();
                    System.out.println(Thread.currentThread().getName() + "释放了资源");
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            
        }
    
    输出:
    pool-1-thread-1获取了资源
    pool-1-thread-2获取了资源
    pool-1-thread-3获取了资源
    pool-1-thread-3准备释放资源
    pool-1-thread-1准备释放资源
    pool-1-thread-1释放了资源
    pool-1-thread-3释放了资源
    pool-1-thread-2准备释放资源
    pool-1-thread-2释放了资源
    pool-1-thread-5获取了资源
    pool-1-thread-4获取了资源
    pool-1-thread-6获取了资源
    pool-1-thread-6准备释放资源
    pool-1-thread-5准备释放资源
    pool-1-thread-4准备释放资源
    pool-1-thread-4释放了资源
    pool-1-thread-7获取了资源
    pool-1-thread-5释放了资源
    pool-1-thread-8获取了资源
    pool-1-thread-6释放了资源
    pool-1-thread-9获取了资源
    pool-1-thread-8准备释放资源
    pool-1-thread-7准备释放资源
    pool-1-thread-10获取了资源
    pool-1-thread-9准备释放资源
    pool-1-thread-9释放了资源
    pool-1-thread-7释放了资源
    pool-1-thread-8释放了资源
    pool-1-thread-10准备释放资源
    pool-1-thread-10释放了资源
    
    

    相关文章

      网友评论

          本文标题:Java并发——Semaphore信号量

          本文链接:https://www.haomeiwen.com/subject/wpcdpxtx.html