`

java信号量使用

阅读更多
       在很多情况下,可能有多个线程需要访问数目很少的资源。假想在服务器上运行着若干个回答客户端请求的线程。这些线程需要连接到同一数据库,但任一时刻只能获得一定数目的数据库连接。你要怎样才能够有效地将这些固定数目的数据库连接分配给大量的线程?
      给方法加锁,保证的是同一时刻只能有一个人去调用此方法,其他所有线程排队等待,即使你的数据库链接有10个,也始终只有一个处于使用状态。
     信号量则能将所有数据库链接有效使用起来,下面是一个典型的使用信号量的例子:
     Semaphore 通常用于限制可以访问某些资源(物理或逻辑的)的线程数目。例如,下面的类使用信号量控制对内容池的访问:

这里是一个实际的情况,大家排队上厕所,厕所只有两个位置,来了10个人需要排队。

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

public class MySemaphore extends Thread {
	Semaphore position;
	private int id;
	public MySemaphore(int i,Semaphore s){
	    this.id=i;
	    this.position=s;
	}

public void run(){
    try{
     if(position.availablePermits()>0){
      System.out.println("顾客["+this.id+"]进入厕所,有空位");
     }
     else{
      System.out.println("顾客["+this.id+"]进入厕所,没空位,排队");
     }
     /*
      *从此信号量获取一个许可,在提供一个许可前一直将线程阻塞,否则线程被中断。 
      *获取一个许可(如果提供了一个)并立即返回,将可用的许可数减 1。 
      *如果没有可用的许可,则在发生以下两种情况之一前,禁止将当前线程用于线程安排目的并使其处于休眠状态
      */
     position.acquire();
     System.out.println("顾客["+this.id+"]获得坑位");
     Thread.sleep((int)(Math.random()*1000));
     System.out.println("顾客["+this.id+"]使用完毕");
     /*
      * 释放一个许可,将其返回给信号量。 
      *释放一个许可,将可用的许可数增加 1。如果任意线程试图获取许可,则选中一个线程并将刚刚释放的许可给予它。然后针对线程安排目的启用(或再启用)该线程。
      */
     position.release();
    }
    catch(Exception e){
     e.printStackTrace();
    }
}
public static void main(String args[]){
    ExecutorService list=Executors.newCachedThreadPool();
    Semaphore position=new Semaphore(2);
    for(int i=0;i<10;i++){
     list.submit(new MySemaphore(i+1,position));
    }
    list.shutdown();
    position.acquireUninterruptibly(2);
    System.out.println("使用完毕,需要清扫了");
    position.release(2);
}
}


      
分享到:
评论
2 楼 wangluo605 2014-03-17  
ExecutorService list = Executors.newCachedThreadPool();
Semaphore position = new Semaphore(2);
for (int i = 0; i < 10; i++) {
list.submit(new MySemaphore(i + 1, position));
}
list.shutdown();
Thread.sleep(100);
while (true) {
if (position.getQueueLength() == 0) {
position.acquireUninterruptibly(2);
break;
}
}
System.out.println(position.getQueueLength() + "使用完毕,需要清扫了");
position.release(2);
可不可以,你能给改一下么
1 楼 wangluo605 2014-03-17  
你这个会经常出现,还有等待获取的线程的时候,就会出现“使用完毕,需要清扫了”的状况。你啥时候可以完善一下。

相关推荐

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

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

    java哲学家就餐问题

    在哲学家就餐问题中,如果不使用信号量,我们也可以考虑使用synchronized来控制哲学家对筷子的访问,但这种方式可能不如信号量那样灵活。 总的来说,这个Java程序展示了如何使用多线程和同步技术解决并发问题,这...

    java 线程同步 信号量控制同步

    信号量机制是 Java 中的一种线程同步机制。信号量是一个整数值,表示当前可用的资源数量。线程可以通过等待信号量来获取资源访问权限。信号量机制可以用于解决生产者-消费者问题、哲学家就餐问题等。 Java 中的 ...

    Java 信号量编程实践

    Java 信号量编程实践 信号量(Semaphore)是并发编程中的一个重要概念,它源自操作系统理论,用于控制多个线程对共享资源的访问。在Java中,`java.util.concurrent.Semaphore`类为我们提供了信号量的功能,它允许...

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

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

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

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

    理发师问题-信号量PV操作实现

    通过使用信号量PV操作,实现了多线程同步,解决了理发师问题。下面是该解决方案的详细介绍。 信号量PV操作 信号量是一种同步机制,它可以用来解决多进程同步问题。PV操作是信号量的一种操作,它可以用来实现进程...

    java同步互斥信号量问题

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

    Java 信号量Semaphore的实现

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

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

    使用信号量,可以实现多个读者同时读取,而写入时阻塞所有读写操作。 - **哲学家就餐问题**:五个哲学家围坐一桌,每个人需要同时拿起左右两边的筷子才能吃饭。通过信号量,可以防止他们同时拿起筷子导致死锁。 在...

    信号量机制实现线程同步

    6. **实际编程中的应用**:在Java中,可以使用`java.util.concurrent.Semaphore`类来实现信号量。创建时指定初始值,然后在线程中调用`acquire()`(等价于P操作)和`release()`(等价于V操作)方法来管理资源访问。 ...

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

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

    利用记录型信号量解决生产者-消费者问题.doc

    在这里,我们将讨论使用记录型信号量解决生产者-消费者问题的方法。 生产者-消费者问题 生产者-消费者问题是一个经典的同步问题,描述了两个或多个进程之间的协作和资源竞争。生产者进程负责生产数据,并将其存储...

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

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

    java信号量控制线程打印顺序的示例分享

    Java信号量(Semaphore)是Java并发包`java.util.concurrent.Semaphore`中的一个类,它是一种同步机制,用于控制同时访问特定资源的线程数量。在这个示例中,信号量被用来控制三个线程(A、B、C)按照特定顺序...

    信号量示例

    信号量(Semaphore)是计算机操作系统中的一个同步工具,主要...理解和正确使用信号量对于编写高效的多线程应用程序至关重要。在实际项目中,开发者需要根据资源的需求和系统特性灵活运用,以实现最佳的并发控制策略。

    Android 线程池、信号量、Looper、缓存初探

    例如,创建一个线程池来并发加载图片,每个线程使用信号量来限制并发请求的数量,使用Looper处理回调到主线程的更新操作,同时利用缓存机制减少网络请求,优化用户体验。 总的来说,理解和熟练运用线程池、信号量、...

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

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

    基于 Java 实现的分布式锁与信号量

    【作品名称】:基于 Java 实现的分布式锁与信号量 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】:基于 Java 实现的...

    模拟交通灯java

    在本文中,我们将深入探讨如何使用Java编程语言来模拟一个行人过马路的按钮式红绿灯系统。这个系统包括了交通灯的周期性变化、行人请求过马路的机制以及信号灯的状态管理。让我们一起深入了解这一过程。 首先,我们...

Global site tag (gtag.js) - Google Analytics