`
fanshaohua110
  • 浏览: 7478 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JAVA中Semaphore(信号量)

阅读更多
Semaphore :一种可以控制访问资源的数量、或者控制同时同一操作的数量。
Semaphore构造器:
public Semaphore(int permits) 需要传入一个正整数,此数量即为控制访问的资源数量。
public Semaphore(int permits, boolean fair) 创建一个是否是公平的信号量。当fair=true
时,线程将会按到达的顺序(FIFO)执行。
下面是Semaphore的方法.
acquire()获取一个许可.当获取后对许可集减去1
acquire(int permits)获取permits个许可,当获取后对许可集减去permits
release()释放一个许可
release(int permits)释放permits个许可
acquireUninterruptibly()一个不可中断的获取一个许可
acquireUninterruptibly(int permits)一个不可中断的获取permits个许可
tryAcquire()试图获取一个许可。如果获取到返回true,否则返回false
tryAcquire(int permits)试图获取permits个许可。如果获取到返回true,否则返回false
tryAcquire(long timeout, TimeUnit unit)单位时间内,试图获取一个许可。如果获取到返回true,否则返回false
tryAcquire(int permits, long timeout, TimeUnit unit)单位时间内,试图获取permits个许可。如果获取到返回true,否则返回false


下面举例说下用法:
1.控制访问数量

package com.asiainfo.concurrent;

import java.util.concurrent.Semaphore;

/**
 * Semaphore 是控制资源的访问数量、或者同时执行同一操作的数量.
 * 
 * 假设我们现在手上只有5台电脑,有10个人想上网。因此只能等有的人不上网了,其他人才有机会上网
 * @author fansh
 *
 */
public class SemaphoreTest {
	
	/**
	 * 特定的资源 ---------只有5台电脑
	 */
	private static Semaphore semaphore = new Semaphore(5);
	
	public static void main(String[] args) {
		SemaphoreTest test = new SemaphoreTest();
		for(int i=0;i<10;i++){
			Person person  = test.new Person(i+"");
			person.start();
		}
	}
	
	class Person extends Thread{
		private String name;
		public Person(String name){
			this.name=name;
		}
		public void run() {
			try {
				semaphore.acquire();
				System.out.println(this.name+"正在上网中.....");
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}finally{
				System.out.println(this.name+"不上网中.....");
				semaphore.release();
			}
		}
	}
	

}


2.使无界队列变为有界队列
package com.asiainfo.concurrent;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Semaphore;

/**
 * Semaphore 
 * 
 * 使无界队列变为有界队列
 * @author fansh
 *
 */
public class SemaphoreTest1<T> {
	private final Semaphore semaphore;
	private final List<T> list = new ArrayList<T>();
	
	public SemaphoreTest1(int bound){
		semaphore= new Semaphore(bound);
	}
	
	public void add(T t){
		try {
			semaphore.acquire();
			list.add(t);
		} catch (InterruptedException e) {
			semaphore.release();
		}
	}
	
	public void remove(T t){
		boolean flag=list.remove(t);
		if(flag){
			semaphore.release();
		}
	}

}


3. 获取许可被中断 和不可中断的用法

package com.asiainfo.concurrent;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.Semaphore;

/**
 * Semaphore 
 * 模拟acquire阻塞时候被中断
 * acquire 抛出InterruptedException 因此是可中断的
 * acquireUninterruptibly 不可中断
 * 
 * @author fansh
 *
 */
public class SemaphoreTest2<T> {
	private final Semaphore semaphore;
	private final List<T> list = new ArrayList<T>();
	
	public SemaphoreTest2(int bound){
		semaphore= new Semaphore(bound);
	}
	
	public void add(T t){
//		try {
//			semaphore.acquire();
//			list.add(t);
//		} catch (InterruptedException e) {
//			System.out.println("添加动作被中断了...........");
//			semaphore.release();
//		}
		// 不可中断测试.....
		semaphore.acquireUninterruptibly();
		list.add(t);
		
	}
	
	public void remove(T t){
		boolean flag=list.remove(t);
		if(flag){
			semaphore.release();
		}
	}
	
	public static void main(String[] args) {
		
		ExecutorService service = Executors.newSingleThreadExecutor();
	    Future future=service.submit(new Runnable() {
			@Override
			public void run() {
				SemaphoreTest2 test2 =new SemaphoreTest2(2);
				test2.add("a");
				test2.add("b");
				test2.add("c");
			}
		});
	    service.shutdown();
	    /**
	     * 等待添加动作充分完成
	     */
	    try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	    future.cancel(true);
	}

}

分享到:
评论

相关推荐

    java并发之Semaphore信号量.md

    Semaphore是计数信号量。Semaphore管理一系列许可证。每个acquire方法阻塞,直到有一个许可证可以获得然后拿走一个许可证;每个release方法增加一个许可证,这可能会释放一个阻塞的acquire方法。然而,其实并没有...

    Java中Semaphore(信号量)的使用方法

    Java中Semaphore(信号量)的使用方法 Semaphore(信号量)是一种非常重要的并发访问控制机制,它可以用来保护一个或者多个共享资源的访问。Semaphore内部维护了一个计数器,其值为可以访问的共享资源的个数。一个...

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

    信号量(Semaphore)是操作系统中一种重要的同步机制,它用于管理多个线程对共享资源的访问,以防止并发执行时产生竞态条件。在多线程编程中,当多个线程试图同时访问一个有限的资源时,信号量可以帮助我们协调这些...

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

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

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

    // 从信号量中获取count个许可 sem.acquire(count); Thread.sleep(2000); System.out.println(Thread.currentThread().getName() + " acquire count=" + count); } catch (InterruptedException e) { e....

    async-semaphore:基于Java并发信号量的计数信号量

    基于 Java 的并发信号量的计数信号量。 安装 通过 npm 安装模块: npm install async-semaphore 快速示例 // fairness false var Semaphore = require ( 'async-semaphore' ) ; var semaphore = new Semaphore ( ...

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

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

    java同步互斥信号量问题

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

    Java 信号量Semaphore的实现

    Java 信号量Semaphore是Java并发编程中的一种机制,用于控制多个线程的并发执行。Semaphore的实现主要是通过计数器来实现的,每个Semaphore对象都维护着一个计数器,用于记录当前可用的许可证数量。 在Java中,...

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

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

    Java 信号量编程实践

    Java中的Semaphore默认为可重用信号量,即允许多个线程同时获取许可,而二进制信号量则类似于一个锁,只允许一个线程持有许可。 **一、Semaphore的构造方法** 1. `Semaphore(int permits)`:创建一个具有指定初始...

    Java编程技巧(信号量,管道)

    在Java中,可以自定义一个名为`mySemaphore`的类来模拟信号量。这个类通常包含两个核心方法:`P()`(代表"PROCedure"或"Pass")和`V()`(代表"VERSus"或"Value increment")。`P()`方法用于尝试获取资源,如果资源不...

    Java信号量Semaphore

    Semaphore  Semaphore分为单值和多值两种,前者只能被一个线程获得,...单个信号量的Semaphore对象可以实现互斥锁的功能,并且可以是由一个线程获得了“锁”,再由另一个线程释放“锁”,这可应用于死锁恢复的一些场

    java哲学家就餐问题

    Java编程中解决这个问题,通常会用到多线程和同步机制,如synchronized关键字或信号量。 在这个解决方案中,"图形界面"使得问题的展示更为直观,用户可以观察到哲学家们的行为和筷子的状态。重庆大学的学生可能会...

    Java中的Semaphore:深入理解与应用实践

    Semaphore 是Java并发编程中实现信号量机制的重要工具。它通过维护一个许可集来控制同时访问特定资源的线程数量,从而避免资源竞争和潜在的性能问题。通过合理使用 Semaphore,可以有效地管理多线程对共享资源的访问...

    信号量Semaphore了解过吗?

    例如,Java中的`java.util.concurrent.Semaphore`类提供了对信号量的操作,包括`acquire()`用于获取资源和`release()`用于释放资源。 了解并掌握信号量的概念和使用,对于处理并发问题至关重要。在面试中,能够详细...

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

    在Java中,`java.util.concurrent.Semaphore`类提供了信号量功能。信号量有两个重要的参数: - 允许的许可证数量:表示可以并发访问的资源数量。 - 是否公平:若为true,按照请求顺序分配许可证;若为false(默认)...

    semaphore控制多线程循序执行

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

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

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

    信号量机制实现线程同步

    6. **实际编程中的应用**:在Java中,可以使用`java.util.concurrent.Semaphore`类来实现信号量。创建时指定初始值,然后在线程中调用`acquire()`(等价于P操作)和`release()`(等价于V操作)方法来管理资源访问。 ...

Global site tag (gtag.js) - Google Analytics