`

concurrent包,多线程信号量Semaphore

阅读更多

     信号量大家都不陌生引用百度百科上的解释

     信号量在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。

     下面学习一下concurrent包下的 Semaphore 类


      举个恶心的例子:蹲茅坑,现在有5个坑,有20个人在排队等着5个坑,那么只有等其中一个人上完了厕所以后,另外一个才能进去。

      Semaphore 正是实现了这种功能。

 

import java.util.concurrent.*;

/**
 * 
 * @author myemptyname
 *
 */

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(NO+"号上厕所: ");
						Thread.sleep((long) (Math.random() * 10000));
						// 上完了 舒服
						semp.release();
						System.out.println(NO+"出厕所");
						System.out.println("现在有"+ semp.availablePermits()+"个茅坑");

					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			};
			exec.execute(run);
		}
		// 退出线程池
		exec.shutdown();
	}

}

 

 

分享到:
评论

相关推荐

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

    在多线程编程中,当多个线程试图同时访问一个有限的资源时,信号量可以帮助我们协调这些线程,确保资源的有序分配和释放。 信号量主要由两个操作组成:`P(Wait)操作`和`V(Signal)操作`。这两个操作通常被封装在...

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

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

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

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

    信号量Semaphore了解过吗?

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

    信号量机制实现线程同步

    信号量机制是操作系统中一种重要的同步机制,它用于控制对共享资源的访问,以避免多线程并发执行时出现的数据不一致性或竞态条件。在本文中,我们将深入探讨信号量的概念、类型以及如何在实际编程中应用信号量来实现...

    多线程concurrent的用例

    6. **Semaphore**: 信号量,用于控制同时访问特定资源的线程数量。在高并发场景下,它可以作为限流或者互斥锁的工具。 7. **Lock接口及其实现类**: `java.util.concurrent.locks`包中的锁接口和实现类,如`...

    java concurrent 包 详细解析

    Java并发包(java.concurrent)是Java平台中处理多线程编程的核心工具包,它提供了丰富的类和接口,使得开发者能够高效、安全地编写多线程程序。这个包的设计目标是提高并发性能,减少同步代码的复杂性,并提供高级...

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

    Java多线程编程是开发高并发应用的关键技术之一,Semaphore工具是Java并发包(java.util.concurrent)中的一个重要组件,用于控制同时访问特定资源的线程数量。本篇将深入讲解Semaphore的基本概念、工作原理以及如何...

    Java多线程的小例子——吃包子

    4. **同步机制**:为了防止多个线程对共享资源的不正确访问,Java提供了多种同步机制,如`synchronized`关键字、`Lock`接口以及相关的同步工具类(如`Semaphore`信号量)。在这个例子中,包子的数量可能是共享资源,...

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

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

    多线程,高并发.zip

    Java提供了多种同步工具,如`synchronized`关键字、`Lock`接口(如`ReentrantLock`)、`Semaphore`信号量、`CountDownLatch`计数器和`CyclicBarrier`回环栅栏。这些工具用于控制线程间的访问顺序,防止数据竞争,...

    java同步互斥信号量问题

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

    多线程demo/java多线程练习

    - **Semaphore**:信号量,用于控制同时访问特定资源的线程数量,通过acquire()获取一个许可,如果没有就等待,release()释放一个许可。 4. **线程安全** - **volatile变量**:保证了内存可见性和有序性,但不...

    Java 信号量编程实践

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

    java并发工具包 java.util.concurrent中文版-带书签版

    8. **Semaphore**:信号量,控制同时访问特定资源的线程数量,用来解决资源争抢问题。 9. **ThreadPoolExecutor**:线程池的具体实现,可以通过配置核心线程数、最大线程数、任务队列等参数来定制线程池的行为。 ...

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

    Semaphore的概念来自于操作系统的信号量,它是一个计数器,每次线程访问资源时,信号量就会减少,直到信号量为0时,其他线程无法访问资源。 二、Semaphore的工作原理 Semaphore的工作原理可以分为两个部分:获取...

    个人总结的深入java多线程开发

    6)信号量Semaphore 31 7)ReentrantLock可重入的互斥锁定 Lock 32 8)阻塞队列BlockingQueue 34 9)已完成任务队列CompletionService 36 10)计时器CountDownLatch 37 11)周期性同步工具CyclicBarrier 38 12)异步计算的...

    Java多线程实例图形版

    在这个实例中,我们可能会使用Semaphore(信号量)来模拟筷子,限制同时就餐的哲学家数量,避免死锁。每个哲学家在拿起筷子前都需要获取信号量,用餐完毕后释放信号量,确保资源的公平分配。 此外,我们还可以利用...

    精通java多线程

    Java的并发集合库(java.util.concurrent包)提供了线程安全的集合类,如ConcurrentHashMap、CopyOnWriteArrayList和ConcurrentLinkedQueue等,它们在多线程环境下能确保数据的一致性和安全性。 十、异常处理 在多...

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

    在Java 5引入并发包`java.util.concurrent`后,信号量作为`Semaphore`类被添加,成为并发编程的一个新特性。 信号量的核心概念是许可(permits),它可以看作是系统中可用资源的数量。当一个线程想要访问公共资源时...

Global site tag (gtag.js) - Google Analytics