`

同步器--Semaphore

    博客分类:
  • J2SE
阅读更多

它可以维护当前访问自身的线程个数,并提供了同步机制,使用它可以控制同时访问资源的线程个数,如实现一个文件允许的并发访问数.

单个信号灯对象可以实现互斥锁的功能,并且可以是由一个线程获得了"锁",再由另一个线程释放"锁",可应用于死锁恢复的场合.

注:还有另一个构造器Semaphore(int permits, boolean fair),其中fair为true表示先进来的先拿到灯,即公平,默认为false.

public class SemaphoreTest {
	
	public static void main(String[] args) {
		ExecutorService service = Executors.newCachedThreadPool();
		final Semaphore sp = new Semaphore(3);
		
		for (int i = 0; i < 10; i++) {
			Runnable runnable = new Runnable() {
				public void run() {
					try {
						sp.acquire();
					} catch (InterruptedException e1) {
						e1.printStackTrace();
					}
					System.out.println("线程" + Thread.currentThread().getName()
							+ "进入,当前已有" + (3 - sp.availablePermits()) + "个并发");
					try {
						Thread.sleep((long) (Math.random() * 10000));
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println("线程" + Thread.currentThread().getName()
							+ "即将离开");
					sp.release();
					// 下面代码有时候执行不准确,因为其没有和上面的代码合成原子单元
					System.out.println("线程" + Thread.currentThread().getName()
							+ "已离开,当前已有" + (3 - sp.availablePermits()) + "个并发");
				}
			};
			service.execute(runnable);
		}
	}
}
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Laravel开发-laravel-semaphore

    在计算机科学中,信号量是一种同步机制,用于控制多个进程或线程对共享资源的访问。在Laravel框架中,信号量可以用来限制同时执行某个任务的数量,从而确保系统的稳定性和性能。 `laravel-semaphore`是专门为...

    semaphore-2.8.22.tar.gz

    在 "semaphore-2.8.22.tar.gz" 文件中,我们获得了 Semaphore 的源代码,版本号为 2.8.22。 Semaphore 项目与 Ansible 的集成允许用户通过图形界面来执行常见的 Ansible 功能,如创建和管理 Playbooks、组织主机和...

    STM32-HAL库-FREERTOS-Semaphore

    STM32-HAL库与FreeRTOS的结合使用是嵌入式开发中的常见实践,尤其在多任务调度中,为了实现任务间的同步和资源管理,常常会用到信号量(Semaphore)。在这个项目中,我们将深入探讨如何在STM32F429IGT6微控制器上,...

    java并发编程之同步器代码示例

    Java并发编程之同步器代码示例 ...Java并发编程之同步器代码示例展示了Java中的同步器机制,包括CountDownLatch、Semaphore、Barrier和Exchanger队列同步器等,帮助开发者更好地理解和使用Java中的并发编程技术。

    第20章 Part4 并发工具同步器.pdf

    - **同步器**:用于实现线程间的同步操作,常见的同步器包括`Semaphore`、`CountDownLatch`、`CyclicBarrier`、`Exchanger`和`Phaser`等。 - **执行器**:用于管理和控制线程的执行,如`ExecutorService`等。 - **...

    Semaphore 源码解析

    1. `Semaphore(int permits)`和`Semaphore(int permits, boolean fair)`构造器:根据传入的参数创建非公平锁或公平锁实例。`permits`表示初始的许可数。 2. `Sync`抽象静态类:继承自AQS,内部实现了Semaphore的...

    Java多线程同步器代码详解

    本文将深入解析四种主要的同步器:CountDownLatch、Semaphore、Barrier和Exchanger,并通过代码示例进行讲解。 1. **CountDownLatch** CountDownLatch是一个计数器,通常用于一次性事件,如等待所有线程完成某个...

    基于SPOC的ucosii_Semaphore实验

    ucOS/II是一个著名的实时操作系统(RTOS),常用于嵌入式系统开发,为微控制器提供多任务环境。在“基于SPOC的ucosii_Semaphore实验”中,我们将探讨如何利用SOPC(System on a Programmable Chip,可编程片上系统)...

    Python多线程同步Lock、RLock、Semaphore、Event实例

    在Python中,由于GIL(全局解释器锁)的存在,多线程并不能充分利用多核CPU的优势,但在处理I/O密集型任务时,多线程仍然是一个有效的选择。以下是对标题和描述中涉及的同步原语的详细说明: 1. **Lock**: - Lock...

    【IT十八掌徐培成】Java基础第08天-03.多线程-同步代码块-同步方法.zip

    此外,Java还提供了其他的并发工具,如`Semaphore`(信号量)、`Lock`接口(包括`ReentrantLock`可重入锁)等,这些工具提供了更灵活的同步策略,可以根据具体场景选择合适的同步机制。 总结一下,Java中的多线程和...

    The java.util.concurrent Synchronizer Framework

    本文围绕Java并发编程中的一个关键组件——java.util.concurrent Synchronizer Framework(同步器框架)进行探讨。该框架主要基于AbstractQueuedSynchronizer(AQS)类,为同步器的实现提供了一种通用机制,包括同步...

    java分布式应用学习笔记05多线程下的并发同步器.pdf

    并发同步器在多线程编程中起到协调各个线程访问共享资源,确保数据一致性与程序正确性的关键作用。本篇笔记将深入探讨Java中的并发同步机制,包括核心概念、工具类以及在实际开发中的应用。 首先,我们要理解什么是...

    The java.util.concurrent synchronizer framework.pdf

    文档标题“java.util.concurrent同步器框架”和描述“Doug Lea的java.util.concurrent同步器框架”表明本文将探讨由Doug Lea所撰写的关于Java并发编程中同步器框架的内容。文档中提到了AbstractQueuedSynchronizer类...

    CountDownLatch、Semaphore等4大并发工具类详解

    应用场景:倒数计时器,例如火箭发射前检查设备、仪器的场景。 Semaphore Semaphore 是一个限流工具类,用于控制访问某个资源的线程数量。它可以限制某个资源的并发访问数量,防止资源被过度访问。Semaphore 提供...

    java编发编程:JUC综合讲解

    4. **同步器(Synchronizers)**:JUC库中的同步器主要是通过AQS(AbstractQueuedSynchronizer)来实现的。AQS是一个抽象类,为锁和同步器提供了一种通用的底层实现。它维护了一个等待队列,提供了基于FIFO的等待...

    同步服务

    1. **线程同步**:在C#中,线程同步是通过多种机制来实现的,例如`Monitor`类、`Mutex`、`Semaphore`和`EventWaitHandle`等。这些同步原语帮助开发者管理多个线程对共享资源的访问,防止数据竞争和不一致状态。 2. ...

Global site tag (gtag.js) - Google Analytics