`
comeonbabye
  • 浏览: 441566 次
  • 性别: 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.pdf

    《深入浅出Java Semaphore》 Semaphore,中文通常称为信号量,是Java并发编程中的一种重要工具,自JDK 1.5版本起被引入。它主要用于控制对特定资源的并发访问,确保资源得到合理的使用。Semaphore维护了一组虚拟的...

    JAVA Semaphore.docx

    在Test类的main方法中,使用newCachedThreadPool()创建了一个缓存线程池,它可以动态调整线程数量,但在这个例子中,线程池的使用主要是为了启动线程,对Semaphore的理解并无直接影响。 总之,Semaphore是Java并发...

    Semaphore 源码解析

    在构造Semaphore时,可以通过传入布尔值决定使用哪种类型的锁。 在Semaphore中,`acquire()`方法用于获取一个许可,如果当前许可数足够,线程将获得同步状态并减少许可数,否则线程将被放入同步队列等待。`release...

    Java多线程Semaphore工具的使用详解.rar

    Java多线程编程是开发高并发应用的关键技术之一,Semaphore工具是Java并发包(java.util.concurrent)中的一个重要组件,用于控制同时访问特定资源的线程数量。本篇将深入讲解Semaphore的基本概念、工作原理以及如何...

    Java中的Semaphore:深入理解与应用实践

    本文将详细介绍 Semaphore 的工作原理、使用方法以及如何在实际项目中应用它。 Semaphore 是Java并发编程中实现信号量机制的重要工具。它通过维护一个许可集来控制同时访问特定资源的线程数量,从而避免资源竞争和...

    java线程并发semaphore类示例

    在Java多线程编程中,线程的并发控制是非常关键的一部分,它确保多个线程能够协同工作并有效地访问共享资源。...在实际开发中,根据需求合理地使用Semaphore可以帮助优化系统的并发性能,确保系统稳定且高效地运行。

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

    `doSomething`方法使用`acquire()`来获取许可证,然后执行业务逻辑,最后通过`release()`释放许可证。`acquire()`会使当前线程阻塞,直到获取到许可证,而`release()`则会释放一个许可证,可能唤醒正在等待的线程。 ...

    semaphore控制多线程循序执行

    除了基本的`acquire()`和`release()`方法,Semaphore还提供了`tryAcquire()`方法,它可以在没有阻塞的情况下尝试获取许可,以及`availablePermits()`方法,用于查询当前可用的许可数量。 在实际应用中,Semaphore常...

    Java中的Semaphore类最全讲义

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

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

    Java中Semaphore(信号量)的使用方法 Semaphore(信号量)是一种非常重要的并发访问控制机制,它可以用来保护一个或者多个共享资源的访问。Semaphore内部维护了一个计数器,其值为可以访问的共享资源的个数。一个...

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

    Semaphore的主要方法包括`acquire()`和`release()`: 1. `acquire()`:尝试获取一个许可证。如果当前许可证数量大于0,则减少一个许可证并返回,否则线程会被阻塞,直到有足够的许可证可用。在这个例子中,`thread1...

    Java并发编程一CountDownLatch、CyclicBarrier、Semaphore初使用

    在实际使用中,根据具体需求选择合适的方法,如CountDownLatch适用于一个线程等待多个线程的场景,CyclicBarrier适合多个线程协作执行多阶段任务,而Semaphore则可以用于限制资源的并发访问。 在深入理解这些工具的...

    JAVA多线程--信号量(Semaphore)_.docx

    在Java中,使用Semaphore可以轻松地实现多线程环境下的资源访问控制,例如: ```java import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent....

    Java 信号量Semaphore的实现

    在每个Runnable对象中,我们使用acquire()方法来获取当前Semaphore对象的许可证,如果获取成功,则执行相应的操作,否则,线程将被阻塞,直到获取到许可证。 在main()方法中,我们创建了一个固定大小的线程池,用于...

    Java基于Semaphore构建阻塞对象池

    在Java并发编程中,Semaphore是一种重要的同步工具类,它提供了对有限资源的访问控制,能够有效地管理和限制同时访问特定资源的线程...了解和熟练掌握Semaphore的使用,对于提升Java并发程序的性能和稳定性至关重要。

    Java 信号量编程实践

    下面是一个简单的Java Semaphore使用示例,模拟了一个只有两个车位的停车场: ```java import java.util.concurrent.Semaphore; public class ParkingLot { private Semaphore semaphore = new Semaphore(2); ...

    Java并发系列之Semaphore源码分析

    Java并发系列之Semaphore源码分析 Java并发系列之Semaphore源码分析是Java并发系列中的一篇重要文章,主要为大家详细介绍了Java并发系列之Semaphore源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。 ...

    java类库 java包

    Java 类库和包是Java编程语言的核心组成部分,它们提供了丰富的功能和工具,使得开发者能够构建复杂的应用程序。本文将深入探讨Java类库和包的...理解和掌握这些类库及包的用法,是成为一位合格Java程序员的关键步骤。

    Java 经典方法整合

    经典方法可能涉及线程同步、并发控制(如synchronized关键字、Semaphore、CountDownLatch)以及线程池的使用。 4. **IO流**:Java的IO流系统允许数据在不同设备间传输。经典方法可能包含文件读写、缓冲流的使用、...

Global site tag (gtag.js) - Google Analytics