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

java Semaphore 信号量详解和实例

 
阅读更多
生产者线程用于往链表里添加节点,数个工作线程从链表取出节点并处理。对于一般的mutex_lock,mutex_unlock方式,如果这一段时间没有工作,那么工作线程将会不停的调用lock,unlock操作。而这样的操作毫无疑义。

在这里系统给我们提供了另外一种同步机制,信号灯,Semaphore。
Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。很多年以来,我都觉得从字面上很难理解Semaphore所表达的含义,只能把它比作是控制流量的红绿灯,比如XX马路要限制流量,只允许同时有一百辆车在这条路上行使,其他的都必须在路口等待,所以前一百辆车会看到绿灯,可以开进这条马路,后面的车会看到红灯,不能驶入XX马路,但是如果前一百辆中有五辆车已经离开了XX马路,那么后面就允许有5辆车驶入马路,这个例子里说的车就是线程,驶入马路就表示线程在执行,离开马路就表示线程执行完成,看见红灯就表示线程被阻塞,不能执行。

Semaphore可以用于做流量控制,特别公用资源有限的应用场景,比如数据库连接。假如有一个需求,要读取几万个文件的数据,因为都是IO密集型任务,我们可以启动几十个线程并发的读取,但是如果读到内存后,还需要存储到数据库中,而数据库的连接数只有10个,这时我们必须控制只有十个线程同时获取数据库连接保存数据,否则会报错无法获取数据库连接。这个时候,我们就可以使用Semaphore来做流控,代码如下:

package thread;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

public class SemaphoreTest {

	private static final int THREAD_COUNT = 30;

	private static ExecutorService threadPool = Executors
			.newFixedThreadPool(THREAD_COUNT);

	private static Semaphore s = new Semaphore(10);

	public static void main(String[] args) {
		for (int i = 0; i < THREAD_COUNT; i++) {
			final int num = i;
			threadPool.execute(new Runnable() {
				@Override
				public void run() {
					try {
						s.acquire();
						System.out.println(Thread.currentThread().getName()+"--save data--"+num);
						s.release();
					} catch (InterruptedException e) {
					}
				}
			});
		}

		threadPool.shutdown();
	}
}




分享到:
评论

相关推荐

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

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

    Java并发编程之Semaphore(信号量)详解及实例

    Java并发编程之Semaphore(信号量)详解及实例 在 Java 中,Semaphore(信号量)是一种非常有用的并发编程工具,主要用于控制访问某些资源的线程数目。下面,我们将详细介绍 Semaphore 的原理、实现和实例。 ...

    PHP信号量基本用法实例详解

    读写信号量是信号量的一个变体,它区分读操作和写操作。在上面的`rw_semaphore`类中,`READ_ACCESS`代表读权限,`WRITE_ACCESS`代表写权限。类内部维护了读者和写作者的数量,通过互斥锁(`$mutex`)保证对计数器...

    java中的多线程实例详解(自己去运行看结果)

    (`java.util.concurrent` 包) 提供了高级线程管理工具,如`ExecutorService`用于管理和控制线程池,`CountDownLatch`用于同步多个线程,`CyclicBarrier`让一组线程等待其他线程到达屏障点,以及`Semaphore`进行信号...

    java多线程设计模式详解

    此外,还可以使用Semaphore信号量、CountDownLatch倒计时锁、CyclicBarrier同步屏障等工具类。 以上是部分Java多线程设计模式的概述,每个模式都有其适用场景和优缺点。实际开发中,开发者应根据需求选择合适的模式...

    java多线程设计模式详解+源码

    3. **线程同步**:为避免多线程环境中的数据不一致性,Java提供了多种同步机制,如synchronized关键字、Lock接口(ReentrantLock)、Semaphore信号量、CountDownLatch倒计时锁和CyclicBarrier同步屏障等。...

    Visual C++精彩实例详解 多线程实例 工程源代码

    Visual C++提供了多种同步原语,如临界区(Critical Section)、互斥量(Mutex)、事件(Event)、信号量(Semaphore)等。这些工具可以帮助开发者控制线程对共享资源的访问,确保数据的一致性和完整性。 此外,线程间的...

    JAVA多线程编程详解-详细操作例子

    Java并发包`java.util.concurrent`提供了如`Semaphore`(信号量)、`CountDownLatch`(计数器)、`CyclicBarrier`(回环栅栏)等工具,它们是设计来协助多线程间的协作和同步的。 理解并熟练运用这些知识点,可以...

    分布式锁与信号量- docx资源

    #### 三、信号量详解 ##### 3.1 概念介绍 信号量是一种更高级的同步机制,它允许一定数量的线程或进程同时访问某个资源。信号量通常用于实现资源池或限制并发访问数量,以避免系统过载。 ##### 3.2 应用场景 - **...

    Python的互斥锁与信号量详解

    在多线程编程中,互斥锁(Mutex)和信号量(Semaphore)是用来保证线程安全、控制对共享资源的并发访问的重要机制。Python通过threading模块提供了一套丰富的同步原语,包括互斥锁和信号量,使得开发者可以更加方便...

    JAVA高质量并发详解,多线程并发深入讲解

    - **Semaphore:** 信号量,用于控制多个线程对共享资源的访问。 #### 二、高级特性和设计模式 - **线程池:** - **ExecutorService:** 提供了一种管理线程的方法,可以控制线程的并发数量,简化线程的管理和...

    Python多线程操作之互斥锁、递归锁、信号量、事件实例详解

    为了解决这一问题,Python提供了多种同步机制,包括互斥锁、递归锁、信号量和事件。下面将详细介绍这些同步工具的概念、原理以及使用方法。 1. 互斥锁(Mutex Lock): 互斥锁是确保同一时间只有一个线程访问特定...

    java多线程设计模式详解PDF及源码

    5. **同步机制**:Java提供了多种同步机制,包括`synchronized`关键字、`Lock`接口(如`ReentrantLock`)、`Semaphore`信号量和`Condition`条件对象。它们用于控制对共享资源的访问,防止数据不一致性和死锁。 6. *...

    java哲学家就餐代码实例

    然而,实际的解决方案可能更复杂,需要考虑到更多的并发控制策略,例如使用信号量(Semaphore)或者读写锁(ReentrantReadWriteLock)。此外,还可以使用非阻塞的并发控制技术,如Java并发库中的`java.util....

    LinuxPthread实例详解及学习文档

    - **信号量(Semaphore)**:`sem_t`类型表示信号量,可以用来控制对资源的访问数量。 - **读写锁(Read-Write Locks)**:允许多个读者同时访问,但只允许一个写者。`pthread_rwlock_t`类型表示读写锁,有`...

    Visual C++网络程序设计实例详解

    此外,同步机制如互斥量(mutex)、事件对象(event)或信号量(semaphore)也会被讨论,以解决线程间的同步问题,防止数据竞争。 网络编程中,错误处理是不可忽视的一部分。书中会讲解如何正确处理网络操作中的...

Global site tag (gtag.js) - Google Analytics