zoukankan      html  css  js  c++  java
  • Semaphore简介

    Semaphore简介

    1. Semaphore是并发包中提供的用于控制某资源同时被访问的个数
    2. 操作系统的信号量是个很重要的概念,在进程控制方面都有应用。Java 并发库 的Semaphore 可以很轻松完成信号量控制,Semaphore可以控制某个资源可被同时访问的个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。
    3. Semaphore维护了当前访问的个数,提供同步机制,控制同时访问的个数
    4. Semaphore类只是一个资源数量的抽象表示,并不负责管理资源对象本身,可能有多个线程同时获取到资源使用许可,因此需要使用同步机制避免数据竞争.

    源码分析

    jdk1.7.0_71

    Semaphore(int permits)

    1
    2
    3
    4
    //指定许可数初始化,非公平模式
    public Semaphore(int permits) {
    sync = new NonfairSync(permits);
    }

    Semaphore(int permits,boolean fair)

    1
    2
    3
    4
    //可在初始化时指定第二个参数为true,使用公平模式
    public Semaphore(int permits, boolean fair) {
    sync = fair ? new FairSync(permits) : new NonfairSync(permits);
    }

    acquire() 阻塞,获取许可,可以被中断

    1
    2
    3
    public void acquire() throws InterruptedException {
    sync.acquireSharedInterruptibly(1);
    }

    acquireUninterruptibly()获取许可,不可中断

    1
    2
    3
    public void acquireUninterruptibly() {
    sync.acquireShared(1);
    }

    tryAcquire()非阻塞,获取许可

    1
    2
    3
    public boolean tryAcquire() {
    return sync.nonfairTryAcquireShared(1) >= 0;
    }

    tryAcquire(long timeout,TimeUnit unit)非阻塞,获取许可

    1
    2
    3
    4
    public boolean tryAcquire(long timeout, TimeUnit unit)
    throws InterruptedException {
    return sync.tryAcquireSharedNanos(1, unit.toNanos(timeout));
    }

    release()释放许可

    1
    2
    3
    public void release() {
    sync.releaseShared(1);
    }

    参考

    http://www.cnblogs.com/whgw/archive/2011/09/29/2195555.html

  • 相关阅读:
    PHP定时备份MySQL,mysqldump语法大全
    虚拟机拷贝之后,发现系统内的开机自启动的nginx,不能自启动了
    八:二叉搜索树的后序遍历
    配置Ubuntu开发环境
    poj 1147 Binary codes
    test
    Python标准库:内置函数reversed(seq)
    Matplotlib 工具包 使用教程索引
    6大设计原则(1):单一职责原则
    hdu 4104
  • 原文地址:https://www.cnblogs.com/zhangboyu/p/7452555.html
Copyright © 2011-2022 走看看