Semaphore即信号量,可以被多个线程获取,下面是一个具体的例子,和Lock配合使用,模拟有三台打印机,一次允许三个线程使用空闲的打印机,代码如下:
package thread; import java.util.concurrent.Semaphore; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * Created with IntelliJ IDEA. * User: malone * Date: 14-4-10 * Time: 上午10:39 * To change this template use File | Settings | File Templates. */ public class SemaphoreDemo { public static void main (String[] args) { Storge storge = new Storge(); for (int i = 0; i < 12; i++) { new MyThread(storge).start(); } } } class Storge { private volatile Boolean[] printer; private Semaphore semaphore; private Lock lock; Storge () { semaphore = new Semaphore(3); printer = new Boolean[3]; for (int i = 0; i < printer.length; i++) { printer[i] = true; } lock = new ReentrantLock(); } public int getFreePrinter () { lock.lock(); try { for (int i = 0; i < printer.length; i++) { if (printer[i]) { printer[i] = false; return i; } } } finally { lock.unlock(); } return -1; } public void setPrinter (int i) { lock.lock(); try { printer[i] = true; } finally { lock.unlock(); } } public void print () { try { //获取信号量 semaphore.acquire(); int freePrinter = getFreePrinter(); System.out.println("Thread " + Thread.currentThread().getName() + " 正在使用" + freePrinter + "号打印机"); Thread.sleep(1000); setPrinter(freePrinter); System.out.println("Thread " + Thread.currentThread().getName() + " 释放" + freePrinter + "号打印机"); } catch (Exception e) { e.printStackTrace(); } finally { semaphore.release(); } } } class MyThread extends Thread { private Storge storge; MyThread (Storge storge) { this.storge = storge; } public void run () { storge.print(); } }
相关推荐
例如,使用`std::binary_semaphore`实现一个允许两个线程并发访问的资源池: ```cpp #include #include #include <semaphore> std::binary_semaphore sem(2); // 初始化为2,允许两个线程同时访问 void access_...
在这个实例中,我们关注的是如何利用Semaphore来管理多线程对多个端口的访问,确保不会出现冲突。Semaphore类可以看作是一个计数器,它维护着一个固定数量的许可证。当一个线程请求一个许可证并获得它时,计数器减一...
1. 初始化Semaphore:创建一个Semaphore实例,传入初始许可数量。如果设置为1,那么只有一个线程可以获取许可并执行任务,从而实现串行化执行。 ```java Semaphore semaphore = new Semaphore(1); // 创建一个只...
`WaitForSingleObjectEx`是一个等待函数,它能让调用进程暂停执行,直到指定的对象(在这个案例中是Semaphore)变为有信号状态或者超时。该函数的参数包括Semaphore句柄、等待时间以及是否被中断。如果Semaphore的...
1. `Semaphore(int permits)`和`Semaphore(int permits, boolean fair)`构造器:根据传入的参数创建非公平锁或公平锁实例。`permits`表示初始的许可数。 2. `Sync`抽象静态类:继承自AQS,内部实现了Semaphore的...
2. `SemaphoreService`是核心代码类,它包含了一个`Semaphore`实例,初始化时传入的参数为1,这意味着在同一时刻只有一个线程可以执行`doSomething`方法。`doSomething`方法使用`acquire()`来获取许可证,然后执行...
"pc_semaphore.zip_pc_semaphore"这个压缩包文件,显然与线程同步机制有关,特别是使用信号量(Semaphore)解决读者-写者问题。信号量是一种在多线程环境中用于控制对共享资源访问的机制,可以防止多个线程同时访问...
Java并发编程之Semaphore(信号量)详解及实例 在 Java 中,Semaphore(信号量)是一种非常有用的并发编程工具,主要用于控制访问某些资源的线程数目。下面,我们将详细介绍 Semaphore 的原理、实现和实例。 ...
在这个特定的案例中,我们关注的是一个专为 Laravel 4.2 设计的包,它简化了与 Semaphore API 的集成过程。 首先,我们需要了解 Laravel 框架。Laravel 是 PHP 的一款流行开源 Web 应用框架,以其优雅的语法和强大...
**JAVA 多线程之信号量Semaphore实例详解** 在Java多线程编程中,信号量Semaphore是一种非常重要的同步工具,用于控制对公共资源的访问。Semaphore类位于`java.util.concurrent`包下,它允许我们限制同时访问特定...
首先,创建一个`Semaphore`实例: ```csharp var semaphor = new Semaphore(50, 50); ``` 然后,定义一个列表`resultPins`来存储下载结果。接下来,遍历需要下载的`pinIdList`集合,对于每个PIN ID,都会执行以下...
本文实例讲述了C++中Semaphore内核对象的用法,分享给大家供大家参考。具体方法如下: 代码如下:// Semaphore.cpp : 定义控制台应用程序的入口点。 // #include “stdafx.h” #include #include ...
例如,当需要限制并发访问的资源数量时,可以使用Semaphore;当需要确保某个操作的原子性时,使用Lock或RLock;而Event则适用于简单的同步或通知机制。 值得注意的是,虽然Python的多线程在CPU密集型任务上可能表现...
Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解 Java并发编程是Java语言中的一种高级技术,用于处理多线程编程中的同步问题。Java 1.5中引入了几个高效的辅助类,包括CountDownLatch、...
总的来说,当遇到RESOURCE_SEMAPHORE等待状态时,需要深入了解查询的内存需求,分析并优化内存使用,以确保SQL Server实例能够高效地运行。同时,建立性能基线,定期监控等待状态,是预防和解决此类问题的关键。
以下将详细讲解C#中多线程的基本使用、线程互斥以及相关的实例。 一、多线程基本使用 在C#中,创建和管理线程主要依赖于`System.Threading`命名空间中的`Thread`类。通过实例化`Thread`类并传入一个`ThreadStart`...
本资源包含六个C#.NET多线程的实例,涵盖了多线程的基本使用到更高级的概念,如线程互斥。以下是这些实例可能涉及的关键知识点: 1. **线程创建**:C#中创建线程主要有两种方式,一是通过`System.Threading.Thread`...
### c语言信号量的使用实例 #### 一、信号量的基本概念 信号量是一种用于解决进程间同步问题的机制,在多线程或多进程环境中尤为重要。它通过控制共享资源的访问来避免竞态条件,确保数据的一致性。信号量本质上是...