`
longgangbai
  • 浏览: 7315849 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java 多线程中Semaphore信号量

阅读更多

 Semaphore信号量:
           可以维护当前访问自身的线程个数,并提供了同步机制。使用Semaphore可以控制同时访问资源的线程个数,例如实现一个文件允许的并发访问数。
 
     获得一项前,每个线程必须从信号量获取许可(semaphore.acquire()),从而保证可以使用该项。该线程结束后,将项返回到池中并将许可返回到该信号量,从而允许其他线程获取该项。注意,调用 acquire() 时无法保持同步锁,因为这会阻止将项返回到池中。信号量封装所需的同步,以限制对池的访问,这同维持该池本身一致性所需的同步是分开的。  故,需要的同步的代码还需要同步,Semaphore只是将线程并发的数目进行限制的一种手段。
 
     单个信号量的Semaphore对象可以实现互斥锁的功能,并且可以是由一个线程获得了"锁",再由另一个线程释放锁,这可应用于死锁恢复的一些场合。
 
 两个构造方法:
   public Semaphore(int permits)
    创建具有给定的许可数和非公平的公平设置的 Semaphore
   public Semaphore(int permits, boolean fair)
    创建具有给定的许可数和给定的公平设置的 Semaphore。
 
    permits - 初始的可用许可数目。此值可能为负数,在这种情况下,必须在授予任何获取前进行释放。
    fair - 如果此信号量保证在争用时按先进先出的顺序授予许可,则为 true;否则为 false。
 
 Semaphore类中的方法的详细说明,请参阅API

 

package com.etrip.concurrent.executor;

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

/**
 * 
 * Semaphore信号量:
 *           可以维护当前访问自身的线程个数,并提供了同步机制。使用Semaphore可以控制同时访问资
 * 源的线程个数,例如实现一个文件允许的并发访问数。

 * 
 * 
 * @author longgangbai
 * 
 */
public class SemaphoreTest {
	
	public static void main(String[] args) {
		// 根据任务的数量具体的分配线程数的线程池
		int threadCount = 10;
		
		ExecutorService service = Executors.newFixedThreadPool(threadCount);
		
		// 创建信号量:最大值为3,即只能允许同时并发访问资源的线程数为3个
		final Semaphore sp = new Semaphore(3,true);
		
		for (int i = 0; i < threadCount; 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(2000L);
					} catch (InterruptedException e) {
						throw new RuntimeException(e);
					}
					System.out.println("线程" + Thread.currentThread().getName() + "即将离开");
					
					sp.release();// 释放许可,必须要释放许可,如果不释放会造成死锁现象。
					// 下面代码有时候执行不准确,因为其没有和上面的代码合成原子单元
					System.out.println("线程" + Thread.currentThread().getName() + "已离开,当前已有" + (3 - sp.availablePermits()) + "个并发");
				}
			};
			//向线程池中添加执行的线程
			service.execute(runnable);
		}
		//关闭线程池
		service.shutdown();
	}
}

 

 

使用信号量创建简单对象池

 

package com.etrip.concurrent.executor;

import java.util.concurrent.Semaphore;
/**
 * 通过信号量实现对象池的应用
 * 
 * @author longgangbai
 */
public class SemaphorePool  {
	   private static final int MAX_AVAILABLE = 100;
	   
	   // Not a particularly efficient data structure; just for demo

	   protected Object[] items =null;
	   protected boolean[] used = new boolean[MAX_AVAILABLE];
	   
	   private final Semaphore available = new Semaphore(MAX_AVAILABLE, true);

	   
	   public SemaphorePool(Object[] items){
		   this.items=items;
	   }
	   
	   /**
	    * 获取对象池中的对象
	    * @return
	    * @throws InterruptedException
	    */
	   public Object getItem() throws InterruptedException {
	     available.acquire();
	     return getNextAvailableItem();
	   }
 
       /**
        * 返还对象到对象池中
        * @param x
        */
	   public void putItem(Object x) {
	     if (markAsUnused(x))
	       available.release();
	   }
     
	   /**
	    * 获取一个可用的对象
	    * @return
	    */
	   protected synchronized Object getNextAvailableItem() {
	     for (int i = 0; i < MAX_AVAILABLE; ++i) {
	       if (!used[i]) {
	          used[i] = true;
	          return items[i];
	       }
	     }
	     return null; // not reached
	   }

	   /**
	    * 标记对象为未用状态
	    * @param item
	    * @return
	    */
	   protected synchronized boolean markAsUnused(Object item) {
	     for (int i = 0; i < MAX_AVAILABLE; ++i) {
	       if (item == items[i]) {
	          if (used[i]) {
	            used[i] = false;
	            return true;
	          } else
	            return false;
	       }
	     }
	     return false;
	   }

	 }

 

 

分享到:
评论

相关推荐

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

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

    java多线程经典案例

    Java提供了多种同步机制,如synchronized关键字、Lock接口(ReentrantLock、ReentrantReadWriteLock)以及Semaphore信号量。synchronized用于方法或代码块,可以保证同一时间只有一个线程执行特定代码,避免数据冲突...

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

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

    汪文君JAVA多线程编程实战(完整不加密)

    本书还涉及到了Java并发工具类,如Semaphore信号量、CyclicBarrier栅栏、CountDownLatch倒计时器等,这些都是Java并发编程中的重要工具,可以帮助开发者更精细地控制线程执行。另外,书中还会介绍如何使用Future和...

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

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

    Java多线程编程实战指南-核心篇

    Java提供了多种同步工具,如synchronized关键字、wait()和notify()方法、Lock接口(包括ReentrantLock可重入锁)以及Semaphore信号量等。这些工具能够确保共享资源在多线程访问时的安全性,防止数据竞争和死锁的发生...

    Java 多线程 PPT

    Java提供了多种同步机制,包括synchronized关键字、Lock接口、Semaphore信号量等。synchronized可以修饰方法或代码块,确保同一时间只有一个线程能够执行特定的代码段;Lock接口提供了更灵活的锁机制,如...

    java多线程设计

    3. 线程同步:Java提供了多种同步机制,如synchronized关键字、volatile变量、Lock接口(ReentrantLock等)、Semaphore信号量、CyclicBarrier屏障等,用于解决多线程环境下资源竞争和数据一致性问题。 二、不可变...

    java多线程设计模式_java_设计模式_多线程_多线程课题_

    Java提供了多种同步机制,如synchronized关键字、wait()和notify()方法、ReentrantLock重入锁、Semaphore信号量等。synchronized用于保证同一时刻只有一个线程访问共享资源,而wait()和notify()用于线程间的通信,...

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

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

    Java多线程下载器

    Java提供了多种并发控制机制,如synchronized关键字、Lock接口(如ReentrantLock)以及Semaphore(信号量)等,用于控制线程的访问权限和执行顺序。 3. **网络I/O**:Java的`java.net`包提供了处理网络通信的基础...

    semaphore控制多线程循序执行

    在"semaphore控制多线程循序执行"的场景中,我们通常会用到计数信号量,它的核心作用是限制同时访问特定资源的线程数量。例如,如果我们要实现一个打印队列,让多个线程按顺序打印任务,Semaphore就可以用来保证打印...

    Java多线程编程

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过`Thread`类和并发工具来实现,接下来我们将深入探讨这些关键知识点。 1. **...

    精通java多线程

    Java提供了多种同步工具,如synchronized关键字、Lock接口(ReentrantLock、ReadWriteLock等)、Semaphore信号量和CountDownLatch计数器。合理使用这些同步工具可以避免死锁、活锁和饥饿等问题。 五、线程间通信 ...

    深入学习:Java多线程编程

    2. **线程同步**:Java提供了多种线程同步机制,如synchronized关键字、wait/notify机制、Lock接口(ReentrantLock、读写锁等)和Semaphore信号量。这些机制用于避免并发问题,如数据竞争、死锁和活锁等。 3. **...

    JAVA多线程端口扫描器

    4. **并发控制**:在多线程环境中,为了保证数据的一致性和避免资源争抢,需要使用并发控制机制,如synchronized关键字、Lock接口、Semaphore信号量等。在端口扫描器中,可能需要这些机制来协调各线程间的操作,确保...

    java多线程并发实战和源码

    线程同步主要包括synchronized关键字、wait/notify机制、Lock锁(如ReentrantLock)以及Semaphore信号量等,它们用于避免竞态条件,确保共享资源的安全访问。 接着,我们来看Java内存模型(JMM),这是理解多线程...

    java多线程示例

    3. Semaphore:信号量,用于限制同时访问某个资源的线程数量。 4. Executors框架:提供线程池服务,有助于管理和控制线程的生命周期。 六、线程优先级 Java中的线程优先级由Thread类的静态常量定义,如MIN_PRIORITY...

    Java多线程的总结

    Java提供了多种同步机制,如synchronized关键字、volatile变量、Lock接口(ReentrantLock、ReadWriteLock等)和Semaphore信号量。synchronized提供互斥访问,保证同一时间只有一个线程访问特定代码块;volatile确保...

    Java多线程实例图形版

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

Global site tag (gtag.js) - Google Analytics