Semaphore [ˈseməfɔːr]可以维护当前访问自身的线程个数,并提供了同步机制。使用Semaphore可以控制同时访问资源的线程个数(即允许n个任务同时访问这个资源),例如,实现一个文件允许的并发访问数。

Semaphore实现的功能就类似厕所有5个坑,假如有十个人要上厕所,那么同时能有多少个人去上厕所呢?同时只能有5个人能够占用,当5个人中的任何一个人让开后,其中在等待的另外5个人中又有一个可以占用了。

另外等待的5个人中可以是随机获得优先机会,也可以是按照先来后到的顺序获得机会,这取决于构造Semaphore对象时传入的参数选项。

单个信号量的Semaphore对象可以实现互斥锁的功能,并且可以是由一个线程获得了“锁”,再由另一个线程释放“锁”,这可应用于死锁恢复的一些场合。

通过acquire()和release()获取和释放访问许可,Semaphore可以初始化是0,然后通过release来变成1

sp.availablePermits()可以获取当前可访问的许可的数量

sp.drainPermits()可以把所有许可全部清零

package java_thread;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.Semaphore;

public class SemaphoreTest {

public static void main(String[] args) {

ExecutorService service = Executors.newCachedThreadPool();

final Semaphore sp = new Semaphore(3);

for(int i=0;i<10;i++){

Runnable runnable = new Runnable(){

public void run(){

try {

sp.acquire();

} catch (InterruptedException e1) {

e1.printStackTrace();

}

System.out.println("线程" + Thread.currentThread().getName() +

"进入,当前已有" + (3-sp.availablePermits()) + "个并发");

try {

Thread.sleep((long)(Math.random()*10000));

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("线程" + Thread.currentThread().getName() +

"即将离开");

sp.release();

//下面代码有时候执行不准确,因为其没有和上面的代码合成原子单元

System.out.println("线程" + Thread.currentThread().getName() +

"已离开,当前已有" + (3-sp.availablePermits()) + "个并发");

}

};

service.execute(runnable);

}

}

}

java 多线程 信号_Java多线程——Semaphore信号灯相关推荐

  1. java线程钥匙_Java多线程并发编程/锁的理解

    一.前言 最近项目遇到多线程并发的情景(并发抢单&恢复库存并行),代码在正常情况下运行没有什么问题,在高并发压测下会出现:库存超发/总库存与sku库存对不上等各种问题. 在运用了 限流/加锁等 ...

  2. java线程 教程_Java多线程系列教程

    Java多线程系列教程 多线程是Java中不可避免的一个重要主体.从本章开始,我们将展开对多线程的学习.接下来的内容是对Java多线程内容的讲解,涉及到的内容包括,Object类中的wait(), n ...

  3. java 多线程 总结_Java 多线程总结

    昨天熬了个通宵,看了一晚上的视频,把java 的多线程相关技术重新复习了一遍,下面对学习过程中遇到的知识点进行下总结. 首先我们先来了解一下进程.线程.并发执行的概念: 进程是指:一个内存中运行的应用 ...

  4. java线程入门_java多线程快速入门(一)

    1.什么是进程 比如:QQ.QQ游戏.eclipse都是进程,可以通过任务管理器查看进程 2.进程和线程区别 线程是进程的一部分,一个进程可以包含多个线程,一个线程只能属于一个进程 进程是所有线程的集 ...

  5. java 高效的多线程同步_java多线程的同步和异步

    java多线程的同步和异步 Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言.Java 技术具有卓越的通用性.高效性.平台移植性和安全性,广泛应用于PC.数据中心.游戏控制台.科学超级计算 ...

  6. java的多线程机制_Java多线程开发(一)| 基本的线程机制

    0. 前言 Java 为了实现跨平台,在语言层面上实现了多线程.我们只需要熟悉 Java 这一套多线程机制就行了,比 C/C++ 要容易多了. 1. 定义任务 我们编写程序,最终是为了完成特定的任务. ...

  7. java信号量源代码_Java信号量Semaphore原理及代码实例

    Semaphore 通常用于限制可以访问某些资源(物理或逻辑的)的线程数目.自从5.0开始,jdk在java.util.concurrent包里提供了Semaphore 的官方实现,因此大家不需要自己 ...

  8. java 多线程 选择题_Java多线程之三道多线程练习题

    三道多线程练习题 接下来,我们来做三道题: 第一题:现有的程序代码模拟产生了16个日志对象,并且需要运行16秒才能打印完这些日志,请在程序中增加4个线程去调用parseLog()方法来分头打印这16个 ...

  9. java 生产者消费者_Java多线程:线程间通信—生产者消费者模型

    一.背景 && 定义 多线程环境下,只要有并发问题,就要保证数据的安全性,一般指的是通过 synchronized 来进行同步. 另一个问题是, 多个线程之间如何协作呢 ? 我们看一个 ...

最新文章

  1. 匿名发差评被判赔3272元,北京研究生遭遇冲上热搜,涉事机构回应:暂不澄清...
  2. Crackme006 - 全新160个CrackMe学习系列(图文|视频|注册机源码)
  3. 影响个人计算机系统功能的因素,影响个人计算机系统功能的因素除了系统使用哪种位的微处理器外,还有CPU的时钟频率、CPU主内存容量、CPU所能提供的指令集。...
  4. android如何实现QQ信息通知,android NotificationListenerService监听通知栏(qq 微信 短信)...
  5. 收获,不止SQL优化——抓住SQL的本质--第五章
  6. Linux 启动顺序
  7. 荐书:「时差党」——出国留学不是一件容易的事
  8. 用了五年 VS Code ,我决定换成 JetBrains……
  9. 参数构造错误 微信_微信公众号开发常见问题
  10. lnmp单独安装php,lnmp 环境,再单独安装php7.2 的版本,多版本php 同时运行
  11. 大国的崛起:第一集:海洋时代(开篇·葡西)
  12. 网站响应速度慢,这些原因不可不知?
  13. matlab excel 新建sheet,matlab excel的sheet增加,重命名操作
  14. civetweb学习
  15. 修复360篡改的,我的主页
  16. 剑指offer第62题 圆圈中最后剩下的数字(约瑟夫问题)
  17. MoCo v1 论文阅读笔记
  18. Oracle GoldenGate视频教程
  19. 百度快照劫持,百度快照劫持解决方法!
  20. kotlin_08:wlan直连/wifi_p2p的页面跳转以及实时获取连接状态

热门文章

  1. GOF23设计模式(创建型模式) 原型模式
  2. Dorado用法与示例
  3. PaddlePaddle推理部署
  4. TensorFlow单层感知机实现
  5. MindSpore后端运行类
  6. Pass Infrastructure基础架构(下)
  7. 满足实时人工智能的计算需求
  8. Python脚本语言写法
  9. Python:Selenium和PhantomJS
  10. C++ 如何获取数组的长度