`
399187879
  • 浏览: 8552 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

JAVA 信号量的使用TestSemaphore

阅读更多
操作系统的信号量是个很重要的概念,在进程控制方面都有应用。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
分享到:
评论

相关推荐

    二值信号量例子TestSemaphore_SRC

    这个"二值信号量例子TestSemaphore_SRC"显然是一个示例程序,用于帮助理解和实践二值信号量的工作原理。 首先,我们要了解什么是信号量。信号量是一个整型变量,它可以被多个进程或线程共享,并通过原子操作(如P...

    c语言信号量的使用实例

    ### c语言信号量的使用实例 #### 一、信号量的基本概念 信号量是一种用于解决进程间同步问题的机制,在多线程或多进程环境中尤为重要。它通过控制共享资源的访问来避免竞态条件,确保数据的一致性。信号量本质上是...

    java哲学家就餐问题

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

    QT 下 信号量使用

    在QT框架中,信号量(Semaphore)是一种非常重要的同步机制,它源于进程间通信(IPC)的概念,并在多线程编程中广泛使用。信号量允许我们控制对共享资源的访问,确保同一时间只有一个线程或者有限数量的线程能够访问...

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

    Redis作为一种高效、轻量级的内存数据存储,常被用作实现分布式锁的工具,而Java的信号量机制则是控制并发访问的一种策略。本篇文章将深入探讨Redis如何实现分布式锁以及Java中的信号量概念,并结合实际应用进行详细...

    c++多线程同步——信号量

    总之,理解并正确使用C++中的信号量机制对于编写高效、可靠的多线程程序至关重要。在MFC工程中,通过自定义信号量类和Windows API,我们可以有效地解决多线程同步问题,确保程序的正确性和性能。

    使用共享内存及信号量实现进程间通信例子

    本示例代码着重于使用共享内存和信号量来解决进程间的通信和同步问题,这是一种高效且灵活的方法,特别是在多处理器和多线程环境中。下面我们将详细探讨这些概念以及它们在Linux系统中的实现。 **共享内存** 是一种...

    易语言多线程控制:信号量控制线程数量

    以下是一个简单的示例,展示了如何在易语言中使用信号量控制线程数量: ```易语言 .信号量 = 创建信号量(5, 5) // 初始化一个信号量,初始值和最大值均为5,表示最多有5个线程并发执行 .线程池 = 创建数组(10, ....

    CSemaphore信号量使用实例

    在这个实例中,我们将探讨`CSemaphore`如何帮助我们实现线程安全的并发控制,以及如何使用`WaitForSingleObject()`和`ReleaseSemaphore()`函数来操作信号量。 信号量是一种同步机制,它可以控制多个线程对共享资源...

    信号量的使用

    在本文中,我们将深入探讨信号量的定义、类型、工作原理,以及如何在实际编程中使用它。我们还将通过源代码分析来理解其运作方式。 信号量,源于荷兰计算机科学家Dijkstra的发明,是并发控制的一种抽象数据类型。它...

    rt-thread信号量_holecev_RT-Thread_rtthread信号量_信号量_

    例如,如果硬件设备只能被一个线程独占使用,可以设置一个计数值为1的信号量,每次有线程想要访问设备时,必须先获取信号量。 RT-Thread中的信号量有两种类型: - **二进制信号量**:计数值范围是0到1。当信号量为...

    labview,2018,信号量-获取信号量-释放信号量

    labview,2018,信号量__获取信号量_释放信号量

    基于FreeRTOS二值信号量程序设计_stm32_二值信号量_

    之后,可以在任务中使用`xSemaphoreTake()`来尝试获取信号量,并使用`xSemaphoreGive()`来释放信号量: ```c // 在任务中尝试获取信号量 if (xSemaphoreTake(xSemaphore, portMAX_DELAY) == pdTRUE) { // 拥有信号...

    硬件信号量在多核处理器核间通信中的应用

    硬件信号量模块由64个独立的信号量组成,这些信号量不与硬件资源或核直接绑定,而是根据每个核处理任务的负载进行动态分配。硬件信号量的访问方式包括直接访问、间接访问和查询方式,这三种方式在软件层面上的实现都...

    操作系统之信号量练习题

    这里使用了两个信号量Rmutex和mutex,Rmutex用于读操作的互斥,mutex用于对整个表格的写操作的互斥。这样可以保证在有写操作时,不会发生读写冲突,同时允许多个读操作并行进行。 以上四个问题都展示了信号量和PV...

    ucos 互斥信号量

    在这个"UCOSIII示例-互斥信号量"中,我们将深入探讨互斥信号量的初始化、使用方法以及它在实际项目中的应用。 首先,互斥信号量是一种特殊的同步机制,用于确保同一时间只有一个任务可以访问某个临界资源。在UCOS...

    linux信号量详解

    初始化无名信号量使用`sem_init`函数,销毁使用`sem_destroy`,增加和减少信号量值分别使用`sem_post`和`sem_wait`函数。 - **命名信号量**则是为了不共享内存空间的进程间通信设计的。它们具有全局可识别的名字,...

    信号量的理解

    信号量可以是二值信号量(只能取0或1)或计数式信号量,前者常用于互斥访问,后者用于管理可并发使用的资源数量。 创建信号量必须在任务启动前或任务级别代码中完成,通过调用`OSSemCreate()`函数,该函数分配事件...

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

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

    STM32F103 Freertos中断管理二值信号量

    2. 信号量初始化:在系统启动时,需要通过`xSemaphoreCreateBinary()`创建二值信号量,并使用`xSemaphoreGive()`确保信号量初始状态为未被获取。 3. 防止死锁:确保任务和ISR在释放信号量后能正确执行,避免出现无法...

Global site tag (gtag.js) - Google Analytics