`

用信号量semaphore构建有界阻塞容器

阅读更多
package com.cn;

import java.util.*;
import java.util.concurrent.Semaphore;

public class BoundedHashSet<T> {
	private final Set<T> set;
	private final Semaphore sem;
	
	public BoundedHashSet(int bound){
		this.set = Collections.synchronizedSet(new HashSet<T>());
		sem = new Semaphore(bound);
	}
	
	public boolean add(T o) throws InterruptedException{
		sem.acquire();
		boolean wasAdded = false;
		try{
			wasAdded = set.add(o);
			return wasAdded;
		}finally{
			if(!wasAdded){
				sem.release();
			}
		}
	}
	
	public boolean remove(Object o){
		boolean wasRemoved = set.remove(o);
		if(wasRemoved){
			sem.release();
		}
		return wasRemoved;
	}
	/**
	 * @param args
	 * @throws InterruptedException 
	 */
	public static void main(String[] args) throws InterruptedException {
		// TODO Auto-generated method stub
		final BoundedHashSet<String> pool = new BoundedHashSet<String>(5);
	
		for(int i = 0; i < 6; i++){
			Thread thread = new Thread(new Worker(String.valueOf(i),pool));
			thread.start();
		}
		Thread.currentThread().sleep(2000);
		Thread thread = new Thread(new Worker2(String.valueOf(2),pool));
		thread.start();
	}
	
}
class Worker implements Runnable{
	private final String s ;
	final BoundedHashSet<String> pool;
	public Worker(String s,BoundedHashSet<String> pool){
		this.s = s;
		this.pool = pool;
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		try {
			pool.add(s);
			System.out.println("set "+ s);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
}

class Worker2 implements Runnable{
	private final String s ;
	final BoundedHashSet<String> pool;
	public Worker2(String s,BoundedHashSet<String> pool){
		this.s = s;
		this.pool = pool;
	}
	@Override
	public void run() {
		pool.remove(s);
		System.out.println("remove "+ s);
	}
	
}

分享到:
评论

相关推荐

    JAVA并发编程实践-构建执行程序块-学习笔记

    Semaphore计数信号量是指在多线程环境下,使用Semaphore来实现线程安全的计数信号量。例如,在桌⾯搜索时,使用Semaphore来实现线程安全的计数信号量,以避免出现死锁、竞态条件等问题。 Barrier栅栏是指在多线程...

    Java语言中非阻塞算法的实现.zip

    - `Semaphore`和`CountDownLatch`:信号量和计数器,用于控制并发线程的数量,实现资源的限流或同步。 4. **Fork/Join框架**: Java 7引入的Fork/Join框架利用工作窃取算法,将大任务拆分为小任务,通过多线程...

    多线程编程.docx

    - **tools部分**:同步工具类,如`Semaphore`(信号量)、`CountDownLatch`(闭锁)和`CyclicBarrier`(栅栏)。 #### 二、并发容器详解 并发容器是Java并发编程中的重要组成部分,它们提供了比传统集合类更强大的...

    Java并发编程与高并发解决方案之并发容器(J.U.C).docx

    `Semaphore`(信号量)用于控制能够访问某些资源(如固定数量的许可证)的线程数量。它能够限制并发操作的数量,对于限制系统资源的访问非常有用。 **示例代码**: ```java @Slf4j public class SemaphoreExample1 ...

    semaforos3

    【标题】"semaforos3" 指的可能是一个与并发编程相关的项目或教程,其中“semaforos”在计算机科学中通常是指信号量(Semaphore),一种用于控制多线程或进程访问共享资源的同步机制。信号量在Java编程语言中是实现...

    并发编程实践,全面介绍基础知识、JVM同步原语、线程安全、低级并发工具、线程安全容器、高级线程协作工具、Executor部分等

    - **信号量**(Semaphore):控制同时访问特定资源的线程数量。 - **闭锁**(CountDownLatch):一次性计数器,用于等待其他线程完成操作。 - **栅栏**(CyclicBarrier):一组线程达到某个点时才继续执行。 - *...

    1工作临时-servlet 多线程问题

    7. **使用锁和信号量**:在某些情况下,可能需要使用锁(如ReentrantLock)或信号量(Semaphore)来控制对共享资源的访问,防止过多的并发操作导致问题。 8. **性能优化**:理解如何正确地处理线程上下文切换,避免...

    Java并发编程(学习笔记).xmind

    (3)使用信号量将任何一种容器变成有界阻塞容器 栅栏 能够阻塞一组线程直到某个事件发生 栅栏和闭锁的区别 所有线程必须同时到达栅栏位置,才能继续执行 闭锁用于等待事件,而栅栏...

    完整的生产者消费者程序

    5. **信号量(Semaphore)**:虽然不是必须的,但信号量可以用于更优雅地管理缓冲区的满和空状态。C++标准库未直接提供信号量,但可以通过互斥量和条件变量模拟实现。 6. **线程同步**:在生产者消费者问题中,线程...

    C++Builder线程样例

    为了确保线程安全,开发者需要关注同步机制,如互斥量(mutex)、信号量(semaphore)或事件对象(event),防止数据竞争和资源冲突。 在“C++Builder线程样例”中,我们可能会看到以下几个关键部分: 1. **线程类...

    JAVA并发编程实践(中文)含源码

    最后,Java并发工具类,如Semaphore(信号量)、CyclicBarrier(回环栅栏)、CountDownLatch(计数器门闩)和Exchanger(交换器),提供了更高级的同步和协调机制,有助于解决复杂并发场景的问题。 通过阅读《JAVA...

    多线程及spring相关面试专题及答案.zip

    4. **线程同步**:为了解决多线程环境中的数据安全问题,Java提供了synchronized关键字、Lock接口(如ReentrantLock可重入锁)、Semaphore信号量等同步机制。 5. **死锁**:当两个或多个线程相互等待对方释放资源而...

    Java 多线程编程核心技术

    为了解决多个线程间的共享数据安全问题,Java提供了多种同步机制,如`synchronized`关键字、`volatile`关键字、`java.util.concurrent`包中的`Lock`接口及其子类`ReentrantLock`,以及`Semaphore`信号量等。...

    使用Java高级实用技术

    - 锁机制:包括内置锁(synchronized)、读写锁(ReentrantReadWriteLock)、信号量(Semaphore)等,用于控制并发访问。 - 原子变量(AtomicXXX类):提供无锁编程能力,保证原子性操作。 2. **反射与动态代理**...

    PDF-Java7ConcurrencyCookbook-英文版.rar

    2. **并发工具类**:Java并发包(java.util.concurrent)提供了丰富的并发工具类,如Semaphore(信号量)、CyclicBarrier(循环栅栏)、CountDownLatch(倒计时锁)等。这些工具帮助开发者更好地控制线程间的同步和...

    java笔试面试大全-附答案

    - **同步机制**:synchronized关键字、Lock锁(如ReentrantLock)、信号量Semaphore、条件变量Condition等。 - **线程状态**:新建、就绪、运行、阻塞、死亡。 4. **反射**: - 反射API:Class类、Constructor类...

    java 多线程编程指南

    另外,Java并发包(java.util.concurrent)提供了更高级的并发工具,如Semaphore(信号量)、CyclicBarrier(回环栅栏)和CountDownLatch(倒计时器),它们简化了线程间的协作。 异常处理在多线程编程中也至关重要...

    《java并发编程实践》

    2. **同步机制**:Java提供了多种同步工具,如synchronized关键字、Lock接口(包括ReentrantLock可重入锁)、Semaphore信号量、CountDownLatch倒计时器等。理解它们的工作原理和使用场景至关重要,因为这能防止数据...

    Java并发编程实战

    5.5.3 信号量82 5.5.4 栅栏83 5.6 构建高效且可伸缩的结果缓存85 第二部分 结构化并发应用程序 第6章 任务执行93 6.1 在线程中执行任务93 6.1.1 串行地执行任务94 6.1.2 显式地为任务创建线程94 6.1.3 ...

    Java并发编程实践

    书中会详细介绍各种同步工具类,如`java.util.concurrent`包下的`Semaphore`信号量、`CyclicBarrier`回环屏障、`CountDownLatch`倒计时器以及`ExecutorService`和`Future`等。这些工具提供了更高级别的同步和协作...

Global site tag (gtag.js) - Google Analytics