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

Java 信号量 Semaphore

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

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

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

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();   
  
        // 只能5个线程同时访问   
  
        final Semaphore semp = new Semaphore(5);   
  
        // 模拟20个客户端访问   
        for (int index = 0; index < 20; 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() * 10000));   
  
                        // 访问完后,释放   
                        semp.release();   
                    } catch (InterruptedException e) {   
  
                    }   
  
                }   
  
            };   
            exec.execute(run);   
        }   
  
        // 退出线程池   
        exec.shutdown();   
    }   
}  


运行结果类似如下:
Accessing: 0
Accessing: 1
Accessing: 3
Accessing: 2
Accessing: 4
Accessing: 6
Accessing: 8
Accessing: 5
Accessing: 7
Accessing: 9
Accessing: 11
Accessing: 10
Accessing: 13
Accessing: 12
Accessing: 14
Accessing: 15
Accessing: 16
Accessing: 17
Accessing: 19
Accessing: 18

转载自:http://399187879.iteye.com/blog/322647
分享到:
评论
1 楼 duicky 2011-07-27  
   

相关推荐

    Java 信号量Semaphore的实现

    Java 信号量Semaphore的实现 Java 信号量Semaphore是Java并发编程中的一种机制,用于控制多个线程的并发执行。Semaphore的实现主要是通过计数器来实现的,每个Semaphore对象都维护着一个计数器,用于记录当前可用的...

    Java信号量Semaphore

    Semaphore  Semaphore分为单值和多值两种,前者只能被一个线程获得,...单个信号量的Semaphore对象可以实现互斥锁的功能,并且可以是由一个线程获得了“锁”,再由另一个线程释放“锁”,这可应用于死锁恢复的一些场

    java并发之Semaphore信号量.md

    Semaphore是计数信号量。Semaphore管理一系列许可证。每个acquire方法阻塞,直到有一个许可证可以获得然后拿走一个许可证;每个release方法增加一个许可证,这可能会释放一个阻塞的acquire方法。然而,其实并没有...

    使用信号量(Semaphore)实现线程的同步

    信号量(Semaphore)是操作系统中一种重要的同步机制,它用于管理多个线程对共享资源的访问,以防止并发执行时产生竞态条件。在多线程编程中,当多个线程试图同时访问一个有限的资源时,信号量可以帮助我们协调这些...

    Java并发编程Semaphore计数信号量详解

    Java并发编程Semaphore计数信号量详解 Java并发编程中,Semaphore(信号量)是一种高效的同步机制,允许一定数量的线程访问某个资源。在本文中,我们将详细介绍Java并发编程Semaphore计数信号量的工作原理和应用。 ...

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

    JAVA多线程--信号量(Semaphore) 信号量(Semaphore)是一种多线程环境下的设施,负责协调各个线程,以保证它们能够正确、合理地使用公共资源。从概念上讲,信号量维护了一个许可集。 信号量的类型有两种:单值信号...

    Java 信号量编程实践

    在Java中,`java.util.concurrent.Semaphore`类为我们提供了信号量的功能,它允许我们限制同时访问某个资源的线程数量,从而实现线程同步和资源管理。 信号量主要包含两种类型:可重用信号量(非递减信号量)和二...

    信号量Semaphore了解过吗?

    信号量Semaphore,这是一个在多线程编程中至关重要的同步机制,尤其在操作系统设计和并发编程领域,它扮演着协调多个线程对共享资源访问的角色。面试中被问及但回答不出,可能会显示出对并发控制理解的不足,因此,...

    JAVA 多线程之信号量(Semaphore)实例详解

    **JAVA 多线程之信号量Semaphore实例详解** 在Java多线程编程中,信号量Semaphore是一种非常重要的同步工具,用于控制对公共资源的访问。Semaphore类位于`java.util.concurrent`包下,它允许我们限制同时访问特定...

    Java进程信号量机制的实验程序

    在Java中,信号量由`java.util.concurrent.Semaphore`类实现,它提供了两种类型:可重用的二进制信号量和计数信号量。 1. **信号量的原理**: - 信号量是一个整数值,表示可用资源的数量。当线程需要使用资源时,...

    async-semaphore:基于Java并发信号量的计数信号量

    基于 Java 的并发信号量的计数信号量。 安装 通过 npm 安装模块: npm install async-semaphore 快速示例 // fairness false var Semaphore = require ( 'async-semaphore' ) ; var semaphore = new Semaphore ( ...

    java哲学家就餐问题

    Java编程中解决这个问题,通常会用到多线程和同步机制,如synchronized关键字或信号量。 在这个解决方案中,"图形界面"使得问题的展示更为直观,用户可以观察到哲学家们的行为和筷子的状态。重庆大学的学生可能会...

    redis实现分布式锁与java信号量.zip

    在实际项目中,`redis实现分布式锁与java信号量.md`文件可能详细介绍了如何将这些理论知识应用到实际代码中,包括连接Redis、设置和获取锁、释放锁、异常处理等步骤。而`项目说明.zip`文件则可能包含了一个实际的...

    semaphore控制多线程循序执行

    Semaphore(信号量)是一种经典的同步机制,它源自于荷兰计算机科学家Edsger W. Dijkstra提出的银行家算法。本示例中,我们将深入探讨如何使用Semaphore来控制多线程的循序执行。 Semaphore是一种计数信号量,它...

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

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

    Java编程技巧(信号量,管道)

    虽然Java标准库没有直接提供同步互斥结构,但它提供了基于对象锁的`wait()`和`notify()`方法,这使得我们可以实现Dijkstra的计数信号量概念。 信号量是一种在多线程编程中用于控制资源访问的机制。在Java中,可以...

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

    Semaphore 是Java并发编程中实现信号量机制的重要工具。它通过维护一个许可集来控制同时访问特定资源的线程数量,从而避免资源竞争和潜在的性能问题。通过合理使用 Semaphore,可以有效地管理多线程对共享资源的访问...

    java同步互斥信号量问题

    在Java中,我们可以使用`java.util.concurrent.Semaphore`类来实现信号量。创建一个信号量时,可以指定初始许可证的数量。以下是一个简单的示例: ```java import java.util.concurrent.Semaphore; public class ...

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

    Semaphore是Java并发编程中的一种重要工具,它是一个计数信号量,可以用来限制对共享资源的访问权限。在Java的`java.util.concurrent`包中,Semaphore类提供了对多个线程并发访问控制的能力,允许我们设置一个固定的...

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

    Semaphore,中文可译为信号量,起源于操作系统中的同步原语,用于协调多个线程对共享资源的访问。它维护了一个计数器,该计数器表示可用许可证的数量。当线程请求许可证时,如果计数器不为零,则会减少一个并允许...

Global site tag (gtag.js) - Google Analytics