`
qtlkw
  • 浏览: 307071 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java Semaphore信号量用法

    博客分类:
  • JAVA
 
阅读更多
如果一个线程要访问一个共享资源,它必须先获得信号量。如果信号量的内部计数器大于0,信号量减1,然后允许访问这个共享资源。计数器大于0意味着有可以使用的资源,线程允许使用其中一个资源。

否则,如果信号量的计数器等于0,信号量将会把线程置入休眠直至计数器大于0,计数器等于0的时候意味着所有的共享资源已经被其他线程使用了,所以需要访问这个共享资源的线程必须等待。

当线程使用完某个共享资源时,信号量必须被释放,以便其他线程能够访问共享资源。释放操作将使信号量的内部计数器增加1。

资源: 打印队列
import java.util.concurrent.Semaphore;

/**
 * Created by Administrator.
 */
public class PrintQueue {
    private final Semaphore semaphore;

    public PrintQueue(){
        semaphore = new Semaphore(1);
    }

    public void printJob(Object document){
        try{
            semaphore.acquire();
            long duration = (long)(Math.random() * 10);
            System.out.printf("%s: PrintQueue: Printing a Job during %d seconds\n", Thread.currentThread()
            .getName(), duration
            );
            Thread.sleep(duration);
        }catch(InterruptedException e){
            e.printStackTrace();
        }finally{
            semaphore.release();
            System.out.printf("%s: Done the print job\n", Thread.currentThread().getName());
        }
    }
}


Runnable job:
public class Job implements Runnable {
    private PrintQueue printQueue;

    public Job(PrintQueue printQueue){
        this.printQueue=printQueue;
    }

    @Override
    public void run(){
        System.out.printf("%s: Going to print a job\n", Thread.currentThread().getName());
        printQueue.printJob(new Object());
        System.out.printf("%s: The document has been printed\n", Thread.currentThread().getName());
    }
}


Main:
public class Main {
    public static void main(String args[]){
        PrintQueue printQueue = new PrintQueue();
        Thread thread[] = new Thread[10];
        for(int i=0; i<10; i++){
            thread[i] = new Thread(new Job(printQueue), "Thread " + i);
        }

        for(int i=0; i<10; i++){
            thread[i].start();
        }
    }
}


用信号量来保护一个资源的多个副本。
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * Created by Administrator.
 */
public class PrintQueue {
    private final Semaphore semaphore;
    private boolean freePrinters[];
    private Lock lockPrinters;

    public PrintQueue(){
        semaphore = new Semaphore(3);
        freePrinters=new boolean[3];

        for(int i=0; i<3; i++){
            freePrinters[i] = true;
        }

        lockPrinters=new ReentrantLock();
    }

    public void printJob(Object document){
        try{
            semaphore.acquire();
            int assignedPrinter = getPrinter();
            long duration = (long)(Math.random() * 10);
            System.out.printf("%s: PrintQueue: Printing a Job in Printer %d during %d seconds\n", Thread.currentThread()
            .getName(), assignedPrinter, duration
            );
            TimeUnit.SECONDS.sleep(duration);
            freePrinters[assignedPrinter]=true;
        }catch(InterruptedException e){
            e.printStackTrace();
        }finally{
            semaphore.release();
            System.out.printf("%s: Done the print job\n", Thread.currentThread().getName());
        }
    }

    private int getPrinter(){
        int ret = -1;
        try{
            lockPrinters.lock();
            for(int i=0; i<freePrinters.length; i++){
                if(freePrinters[i]){
                    ret = i;
                    freePrinters[i] = false;
                    break;
                }
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            lockPrinters.unlock();
        }

        return ret;
    }
}

分享到:
评论

相关推荐

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

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

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

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

    Java 信号量编程实践

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

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

    Semaphore当前在多线程环境下被扩放用法,操作系统的信号量是个很重要的概念,在进程掌握方面都有应用。Java并发库Semaphore可以很轻松完成信号量掌握,Semaphore可以掌握某个资源可被同时访问的个数,通过acquire()...

    Java 信号量Semaphore的实现

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

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

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

    java哲学家就餐问题

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

    深入浅出java Semaphore.pdf

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

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

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

    JAVA Semaphore.docx

    Semaphore类提供了信号量的概念,允许我们设定一个固定的许可(或者称为权限)数量,只有拥有足够许可的线程才能继续执行。 在描述中提到的场景,比如限制WebServer同时处理的请求数量为500个,Semaphore就非常适用...

    java同步互斥信号量问题

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

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

    在Java中,`java.util.concurrent.Semaphore`类提供了信号量功能。信号量有两个重要的参数: - 允许的许可证数量:表示可以并发访问的资源数量。 - 是否公平:若为true,按照请求顺序分配许可证;若为false(默认)...

    semaphore控制多线程循序执行

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

    不死锁的哲学家问题实现 java

    在Java中,我们可以使用信号量(Semaphore)来解决不死锁的哲学家问题。信号量是一种同步原语,用于控制对共享资源的访问。在本实现中,我们将创建两个类型的信号量:一个用于表示筷子,另一个用于控制哲学家可以...

    信号量机制实现线程同步

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

    semaphore:显示简单信号量的Android应用程序

    标题“semaphore:显示简单信号量的Android应用程序”揭示了这是一个基于Android平台的应用程序,它使用了计算机科学中的“信号量”概念。在操作系统中,信号量是一种同步机制,用于控制对共享资源的访问,以防止多个...

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

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

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

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

    Java并发编程(23)并发新特性-信号量Semaphor

    信号量(Semaphore)是Java并发库中的一种工具类,它提供了一种控制多个线程对共享资源访问的方式,从而实现高级别的同步。在Java 5引入并发包`java.util.concurrent`后,信号量作为`Semaphore`类被添加,成为并发...

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

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

Global site tag (gtag.js) - Google Analytics