`
comeonbabye
  • 浏览: 438355 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java Semaphore用法

    博客分类:
  • JAVA
阅读更多

操作系统的信号量是个很重要的概念,在进程控制方面都有应用。Java 并发库 的Semaphore 可以很轻松完成信号量控制,Semaphore可以控制某个资源可被同时访问的个数,acquire()获取一个许可,如果没有就等待,而 release()释放一个许可。比如在Windows下可以设置共享文件的最大客户端访问个数。 

Semaphore维护了当前访问的个数,提供同步机制,控制同时访问的个数。在数据结构中链表可以保存“无限”的节点,用Semaphore可以实现有限大小的链表。另外重入锁ReentrantLock也可以实现该功能,但实现上要负责些,代码也要复杂些。 

下面的Demo中申明了一个只有5个许可的Semaphore,而有20个线程要访问这个资源,通过acquire()和release()获取和释放访问许可。

package com.cisco.learning;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

public class TestSemaphore {

 public static void main(String[] args) {
  // 线程池
  ExecutorService exec = Executors.newCachedThreadPool();

  // 只能个线程同时访问
  final Semaphore semp = new Semaphore(5);

  // 模拟个客户端访问
  for (int index = 1; index < 21; index++) {
   final int NO = index;
   Runnable run = new Runnable() {
    public void run() {
     try {
      // 获取许可
      semp.acquire();
      System.out.println("Accessing: " + NO);
      
      Thread.sleep((long) (Math.random() * 1000));

      // 访问完后,释放
      System.out.println("Release: " + NO);
      semp.release();
     } catch (InterruptedException e) {

     }
    }

   };
   exec.execute(run);
  }

  // 退出线程池
  exec.shutdown();
 }
}

Accessing: 1
Accessing: 3
Accessing: 2
Accessing: 4
Accessing: 5
Release: 5
Accessing: 6
Release: 1
Accessing: 7
Release: 4
Accessing: 9
Release: 3
Accessing: 8
Release: 9
Accessing: 10
Release: 6
Accessing: 11
Release: 7
Accessing: 12
Release: 12
Accessing: 13
Release: 13
Accessing: 14
Release: 2
Accessing: 15
Release: 10
Accessing: 16
Release: 15
Accessing: 17
Release: 8
Accessing: 18
Release: 18
Accessing: 19
Release: 17
Accessing: 20
Release: 16
Release: 11
Release: 14
Release: 19
Release: 20

分享到:
评论

相关推荐

    带你看看Java的锁(二)-Semaphore

    带你看看Java的锁-Semaphore前言简介使用源码分析类结构图SyncNonfairSyncFairSyncSemaphore 构造函数Semaphore 成员方法获取释放总结 前言 简介 Semaphore 中文称信号量,它和ReentrantLock 有所区别,...

    Java中的Semaphore类最全讲义

    Semaphore的基本用法 2.1 创建Semaphore对象 2.2 acquire()方法 2.3 release()方法 控制资源访问数量 3.1 场景介绍 3.2 使用Semaphore控制资源访问 实现有界资源池 4.1 场景介绍 4.2 使用Semaphore实现有界资源池 ...

    java并发核心Semaphore 的使用思路.docx

    Semaphore的初步使用 Semaphore是什么,能做什么? Semaphore 是 synchronized 的加强版,作用是控制线程的并发数量。就这一点而言,单纯的synchronized 关键字是实现不了的。 直接看例子吧,这个例子包含3个类,一...

    Java中Semaphore(信号量)的使用方法

    主要介绍了Java中Semaphore(信号量)的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    java jdk实列宝典 光盘源代码

    java为数据结构中的映射定义一个接口java.util.Map,有四个实现类HashMap Hashtable LinkedHashMap TreeMap用法和区别;对Map排序; 5字符串 使用String;判断一个字符串是否是合法的java标识符;使用StringBuffer;...

    SemaphoreTest

    代码清晰的展示了生产者与消费者模式,以及Java中semaphore信号量的使用方法

    java并发编程三剑客

    目录java并发编程三剑客思维导图CountDownLatch用法构造器以及方法构造器主要方法使用方法CyclicBarrier用法构造器以及主要方法构造器主要方法使用方法Semaphore用法构造器和主要方法构造器主要方法使用方法三种辅助...

    Java进阶教程,面试大全

    synchronized在静态方法和普通方法的区别。 怎么实现所有线程在等待某个事件的发生才会去执行。 CAS。 Hashtable是怎么加锁的。 HashMap的并发问题。 ConcurrenHashMap 介绍。 AQS。 如何检测死锁,怎么预防死锁。 ...

    Java进阶教程,面试大全,包罗万象

    synchronized在静态方法和普通方法的区别。 怎么实现所有线程在等待某个事件的发生才会去执行。 CAS。 Hashtable是怎么加锁的。 HashMap的并发问题。 ConcurrenHashMap 介绍。 AQS。 如何检测死锁,怎么预防死锁。 ...

    Java JDK实例宝典

    全部代码出自电子工业出版社夏先波的《Java JDK实例宝典》一书,本书以J2SE 5.0为开发环境,选取Java应用的典型实例,循序渐进地介绍了Java语言的各种开发方法和技巧,实例代码注释详细规范,思路清晰。 第1章 ...

    Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解

    主要介绍了Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解的相关资料,需要的朋友可以参考下

    Java并发编程(学习笔记).xmind

    (1)用作异步任务使用,且可以使用get方法获取任务的结果 (2)用于表示一些时间较长的计算 状态 等待运行 正在运行 运行完成 使用Callable对象实例化FutureTask类 ...

    java核心知识点整理.pdf

    25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................

    个人总结的深入java多线程开发

    看完《think in java》多线程章节,自己写的多线程文档,还结合了其他的相关网络资料。 线程 一. 线程池 1)为什么要使用线程池 2 2)一个具有线程池的工作队列 3 3)使用线程池的风险: 4 4)有效使用线程池的原则 5...

    Java并发编程实战

    14.6.2 Semaphore与CountDownLatch258 14.6.3 FutureTask259 14.6.4 ReentrantReadWriteLock259 第15章 原子变量与非阻塞同步机制261 15.1 锁的劣势261 15.2 硬件对并发的支持262 15.2.1 比较并交换263 ...

    JAVA核心知识点整理(有效)

    25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................

    JAVA并发编程-2-线程并发工具类

    JAVA并发编程-2-线程并发工具类一、Fork/Join1、分而治之与工作密取2、使用标准范式3、Fork/Join的同步用法4、Fork/Join的异步用法二、CountDownLatch三、CyclicBarrier四、Semaphore信号量五、Exchanger ...

    producers-consumers-rmi:基于Java RMI的分布式生产者-消费者问题的实现

    该项目包含基于Java RMI(远程方法调用)的分布式的简单实现。 作为实践的一种手段,实现了一对信号量(即公平和不公平的信号量),它们仅使用Java的synchronized原语。 信号量 有两种可用的信号量: FairSemaphore...

    php多进程框架-模拟java多线程接口simple-fork-php.zip

    SimpleFork simple-fork-php 是基于 PCNTL ... 如何使用declare(ticks=1); declare(ticks=1); 这段声明用于进程信号处理。如果注册了信号处理器,程序会没执行一行代码后自动检查是否有尚未处理的信号。...

    javabiginteger源码-MultiThreadMode:多线程模式

    也可使用Semaphore类设置资源数量 Immutable模式 Immutable类:通过final关键字设置类的属性,且类中不存在setter方法。 优点:不需使用synchronized保护类的属性,适用于类被多个线程共享,且有可能被频繁访问。 ...

Global site tag (gtag.js) - Google Analytics