转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6557874.html 

学过操作系统的对 信号量 这个词应该不陌生,它是用来进行进程间通信,控制对 临界区(即同步代码块) 的访问的。

Semaphore与syncrhoized、ReentrantLock加锁的方法不同,后两者是针对一把锁来实现同步互斥的(一个时刻只能有一个线程持有该锁),而Semaphore是一个共享锁,允许多个线程同时持有它,即同一时刻允许有多个线程同时操作临界区。只有当信号量为0时,申请进入临界区的线程才阻塞。

使用信号量分为:

1:创建信号量,指定有共享名额:e.g. final Semaphore semaphore = new Semaphore(3);

2:在需要进入临界区(同步代码块)时,申请获得信号量。如果获得成功,就会进入临界区执行,并且信号量共享名额会自动减一;如果信号量已经为0,则申请失败,阻塞线程:semaphore.acquire();

{临界区代码......}

3:执行完同步代码后,释放信号量,此时信号量+1:{临界区代码...;}

semaphore.release();

Java多线程之Semaphore信号量的更多相关文章

  1. JAVA多线程之Semaphore

    Semaphore:动态增减信号量,用于控制对某资源访问的同一时间的并发量.类似于令牌,谁拿到令牌(acquire)就可以去执行了,如果没有令牌则需要等待. [如何获取]:semaphore.tryA ...

  2. python中的线程之semaphore信号量

    semaphore是一个内置的计数器 每当调用acquire()时,内置计数器-1 每当调用release()时,内置计数器+1 计数器不能小于0,当计数器为0时,acquire()将阻塞线程直到其他 ...

  3. Java多线程之ConcurrentSkipListMap深入分析(转)

    Java多线程之ConcurrentSkipListMap深入分析   一.前言 concurrentHashMap与ConcurrentSkipListMap性能测试 在4线程1.6万数据的条件下, ...

  4. JAVA多线程之wait/notify

    本文主要学习JAVA多线程中的 wait()方法 与 notify()/notifyAll()方法的用法. ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 ②wait ...

  5. JAVA多线程之volatile 与 synchronized 的比较

    一,volatile关键字的可见性 要想理解volatile关键字,得先了解下JAVA的内存模型,Java内存模型的抽象示意图如下: 从图中可以看出: ①每个线程都有一个自己的本地内存空间--线程栈空 ...

  6. java多线程之yield,join,wait,sleep的区别

    Java多线程之yield,join,wait,sleep的区别 Java多线程中,经常会遇到yield,join,wait和sleep方法.容易混淆他们的功能及作用.自己仔细研究了下,他们主要的区别 ...

  7. Java多线程之Runnable与Thread

    Java多线程之Thread与Runnable 一.Thread VS Runnable 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类和 ...

  8. JAVA多线程之UncaughtExceptionHandler——处理非正常的线程中止

    JAVA多线程之UncaughtExceptionHandler——处理非正常的线程中止 背景 当单线程的程序发生一个未捕获的异常时我们可以采用try....catch进行异常的捕获,但是在多线程环境 ...

  9. java多线程之wait和notify协作,生产者和消费者

    这篇直接贴代码了 package cn.javaBase.study_thread1; class Source { public static int num = 0; //假设这是馒头的数量 } ...

随机推荐

  1. linux 7z 命令编译安装,mac安装p7zip

    linux 7z 命令编译安装 7zip是一个开源的压缩软件  7z格式是压缩率最高的格式 服务器备份 数据几个g 要是tar压缩下载的话 时间太长  7zip压缩出来体积很小 首先安装 我这是 ce ...

  2. hive php连接查询

    baidu hive php PHP连接Hive执行sql查询 php通过 thrift访问hadoop的hive php开发Hive Web查询 php连接hive执行sql查询 利用python将 ...

  3. 在SqlServer 中解析JSON数据 [parseJSON] 函数 数据库中 解析JSON

    使用如下: SELECT * FROM parseJSON('{ "联系人": { "姓名": "huang", "网名" ...

  4. BZOJ1337: 最小圆覆盖

    题目:求n个点的最小圆覆盖. 题解:最小圆覆盖,上模板.复杂度证明可以戳:这里 代码: #include<cstdio> #include<cstdlib> #include& ...

  5. 数据库实例: STOREBOOK > 用户 > 编辑 用户: SYSMAN

    ylbtech-Oracle:数据库实例: STOREBOOK  >  用户  >  编辑 用户: SYSMAN 编辑 用户: SYSMAN 1. 一般信息返回顶部 1.1,   1.2, ...

  6. SharePoint自定义程序页面部署 不用重启IIS

    SharePoint的部署方式默认是部署WSP包,尤其是有多个前端的时候WSP包的部署显得非常方便和快捷,但是WSP的部署需要重启整个IIS服务会造成SharePoint站点一段时间不能访问.结合自己 ...

  7. kaggle-Corporación Favorita Grocery Sales Forecasting

    https://blog.csdn.net/bitcs_zt/article/details/79256688 该项比赛1月15日就已经结赛了,但由于之后进入期末,备考花费了大量的时间,没来得及整理相 ...

  8. List 多次排序

    List<Patientmain> list = patientmains.OrderBy(p => p.Firstname).ThenBy(p => p.Middlename ...

  9. linux命令学习——file

    1.简介 file命令是用来检测并显示文件类型(determine file type).通过file指令,我们得以辨识该文件的类型,例如可以知道动态连接库是32位还是64位. 2.命令格式 file ...

  10. C++ 对象的定义

    1.考虑下面的方法void Print(const Student& s){ printf("Student[%s:%d]\n", s._Name.c_str(), s._ ...