Thinking in Java学习笔记 Semaphore控制的资源池

Java后端资源池面试题汇总(银行类面试) 收集的Java后端资源池面试题汇总(针对银行类面试) 立即下载

SemaphoreDemo.java

一个资源池Pool,可以由多个线程检出和检入其中的资源,由Semaphore控制同步问题,由数组来记录每个资源的检出/检入状态


CheckoutTask这个线程,启动多个,负责检入检出资源。


资源类Fat,有比较复杂的计算


同时在main()方法中对资源进行了检出和检入操作

package com.test.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;
import java.util.concurrent.TimeUnit;

public class SemaphoreDemo {
	static final int SIZE=25;
	public static void main(String[] args) throws InterruptedException {
		// TODO Auto-generated method stub
		final Pool<Fat> pool=new Pool(SIZE,Fat.class);
		ExecutorService exec=Executors.newCachedThreadPool();
		for(int i=0;i<SIZE;i++){
			exec.execute(new CheckoutTask(pool));
		}
		System.out.println("All checkoutTask created!!!");
		List<Fat> list=new ArrayList<Fat>();
		for(int i=0;i<SIZE;i++){
			Fat f=pool.checkOut();
			System.out.println(i+" : main() thread check out");
			f.operation();
			list.add(f);
		}
		Future<?> blocked=exec.submit(new Runnable(){
			public void run(){
				try {
					pool.checkOut();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					System.out.println("Checkout Interrupted!!!!!!!!!!!!");
					e.printStackTrace();
				}
			}
		});
		TimeUnit.SECONDS.sleep(2);
		blocked.cancel(true);
		System.out.println("-------------Checking in objects in "+list);
		for(int i=0;i<SIZE;i++){
			Fat item=list.get(i);
			pool.checkIn(item);
		}
		for(Fat f:list){
			pool.checkIn(f);
		exec.shutdown();	
		}
	}

}

class Pool<T>{
	private int size;
	private Semaphore available;
	private volatile boolean checkOut[];
	private List<T> items=new ArrayList<T>();
	public Pool(int size, Class<T> objectClass){
		this.size=size;
		available=new Semaphore(size,true);
		checkOut=new boolean[size];
		for(int i=0;i<size;i++){
			try {
				items.add(objectClass.newInstance());
			} catch (InstantiationException | IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	public T checkOut() throws InterruptedException{
			available.acquire();
			return getItem();
	}
	public void checkIn(T t){
		if(releaseItem(t))
			available.release();
	}
	private synchronized T getItem(){
		for(int i=0;i<size;i++){
			if(!checkOut[i]){
				checkOut[i]=true;
				return (T)items.get(i);
			}
		}
		return null;
	}
	private synchronized boolean releaseItem(T item){
		int index=items.indexOf(item);
		if(index<0){
			return false;
		}
		if(checkOut[index]){
			checkOut[index]=false;
			return true;
		}
		return false;
	}
}
class Fat{
	private volatile double d; //prevent optimization
	private static int counter=0;
	private final int id=counter++;
	public Fat(){
		for(int i=0;i<10000;i++){
			d+=(Math.PI+Math.E);
		}
	}
	public String toString(){
		return "Fat id: "+id+"  D:"+d;
	}
	public void operation(){
		System.out.println(this);
	}
}
class CheckoutTask<T> implements Runnable{
	private static int counter=0;
	private final int id=counter++;
	Pool<T> pool;
	public CheckoutTask(Pool<T> pool){
		this.pool=pool;
	}
	@Override
	public void run(){
		try {
			T item=pool.checkOut();
			System.out.println(this+" check out "+item);
			TimeUnit.SECONDS.sleep(1);
			System.out.println(this+" check in "+item);
			pool.checkIn(item);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public String toString(){
		return "CheckoutTask id:"+id+"   ";
	}
}


输出为:

All checkoutTask created!!!
0 : main() thread check out
CheckoutTask id:9    check out Fat id: 9  D:58598.74482048422
CheckoutTask id:4    check out Fat id: 4  D:58598.74482048422
CheckoutTask id:23    check out Fat id: 24  D:58598.74482048422
CheckoutTask id:19    check out Fat id: 17  D:58598.74482048422
CheckoutTask id:0    check out Fat id: 0  D:58598.74482048422
CheckoutTask id:16    check out Fat id: 16  D:58598.74482048422
CheckoutTask id:20    check out Fat id: 18  D:58598.74482048422
CheckoutTask id:6    check out Fat id: 6  D:58598.74482048422
CheckoutTask id:11    check out Fat id: 11  D:58598.74482048422
CheckoutTask id:8    check out Fat id: 8  D:58598.74482048422
CheckoutTask id:7    check out Fat id: 7  D:58598.74482048422
CheckoutTask id:10    check out Fat id: 10  D:58598.74482048422
CheckoutTask id:21    check out Fat id: 22  D:58598.74482048422
CheckoutTask id:22    check out Fat id: 19  D:58598.74482048422
CheckoutTask id:17    check out Fat id: 21  D:58598.74482048422
CheckoutTask id:1    check out Fat id: 1  D:58598.74482048422
CheckoutTask id:12    check out Fat id: 15  D:58598.74482048422
CheckoutTask id:18    check out Fat id: 20  D:58598.74482048422
CheckoutTask id:13    check out Fat id: 12  D:58598.74482048422
CheckoutTask id:2    check out Fat id: 2  D:58598.74482048422
CheckoutTask id:14    check out Fat id: 13  D:58598.74482048422
CheckoutTask id:15    check out Fat id: 14  D:58598.74482048422
Fat id: 23  D:58598.74482048422
CheckoutTask id:3    check out Fat id: 3  D:58598.74482048422
CheckoutTask id:5    check out Fat id: 5  D:58598.74482048422
CheckoutTask id:9    check in Fat id: 9  D:58598.74482048422
CheckoutTask id:20    check in Fat id: 18  D:58598.74482048422
CheckoutTask id:16    check in Fat id: 16  D:58598.74482048422
CheckoutTask id:0    check in Fat id: 0  D:58598.74482048422
1 : main() thread check out
Fat id: 16  D:58598.74482048422
2 : main() thread check out
Fat id: 0  D:58598.74482048422
3 : main() thread check out
Fat id: 18  D:58598.74482048422
CheckoutTask id:4    check in Fat id: 4  D:58598.74482048422
CheckoutTask id:23    check in Fat id: 24  D:58598.74482048422
4 : main() thread check out
Fat id: 4  D:58598.74482048422
5 : main() thread check out
Fat id: 24  D:58598.74482048422
CheckoutTask id:12    check in Fat id: 15  D:58598.74482048422
CheckoutTask id:8    check in Fat id: 8  D:58598.74482048422
6 : main() thread check out
Fat id: 15  D:58598.74482048422
7 : main() thread check out
Fat id: 8  D:58598.74482048422
CheckoutTask id:19    check in Fat id: 17  D:58598.74482048422
CheckoutTask id:24    check out Fat id: 9  D:58598.74482048422
8 : main() thread check out
Fat id: 17  D:58598.74482048422
CheckoutTask id:17    check in Fat id: 21  D:58598.74482048422
9 : main() thread check out
Fat id: 21  D:58598.74482048422
CheckoutTask id:14    check in Fat id: 13  D:58598.74482048422
10 : main() thread check out
Fat id: 13  D:58598.74482048422
CheckoutTask id:11    check in Fat id: 11  D:58598.74482048422
11 : main() thread check out
Fat id: 11  D:58598.74482048422
CheckoutTask id:6    check in Fat id: 6  D:58598.74482048422
12 : main() thread check out
Fat id: 6  D:58598.74482048422
CheckoutTask id:5    check in Fat id: 5  D:58598.74482048422
13 : main() thread check out
Fat id: 5  D:58598.74482048422
CheckoutTask id:7    check in Fat id: 7  D:58598.74482048422
14 : main() thread check out
Fat id: 7  D:58598.74482048422
CheckoutTask id:10    check in Fat id: 10  D:58598.74482048422
15 : main() thread check out
Fat id: 10  D:58598.74482048422
CheckoutTask id:21    check in Fat id: 22  D:58598.74482048422
16 : main() thread check out
Fat id: 22  D:58598.74482048422
CheckoutTask id:22    check in Fat id: 19  D:58598.74482048422
17 : main() thread check out
Fat id: 19  D:58598.74482048422
CheckoutTask id:1    check in Fat id: 1  D:58598.74482048422
18 : main() thread check out
Fat id: 1  D:58598.74482048422
CheckoutTask id:18    check in Fat id: 20  D:58598.74482048422
19 : main() thread check out
Fat id: 20  D:58598.74482048422
CheckoutTask id:13    check in Fat id: 12  D:58598.74482048422
20 : main() thread check out
Fat id: 12  D:58598.74482048422
CheckoutTask id:2    check in Fat id: 2  D:58598.74482048422
21 : main() thread check out
Fat id: 2  D:58598.74482048422
CheckoutTask id:15    check in Fat id: 14  D:58598.74482048422
22 : main() thread check out
Fat id: 14  D:58598.74482048422
CheckoutTask id:3    check in Fat id: 3  D:58598.74482048422
23 : main() thread check out
Fat id: 3  D:58598.74482048422
CheckoutTask id:24    check in Fat id: 9  D:58598.74482048422
24 : main() thread check out
Fat id: 9  D:58598.74482048422
Checkout Interrupted!!!!!!!!!!!!
-------------Checking in objects in [Fat id: 23  D:58598.74482048422, Fat id: 16  D:58598.74482048422, Fat id: 0  D:58598.74482048422, Fat id: 18  D:58598.74482048422, Fat id: 4  D:58598.74482048422, Fat id: 24  D:58598.74482048422, Fat id: 15  D:58598.74482048422, Fat id: 8  D:58598.74482048422, Fat id: 17  D:58598.74482048422, Fat id: 21  D:58598.74482048422, Fat id: 13  D:58598.74482048422, Fat id: 11  D:58598.74482048422, Fat id: 6  D:58598.74482048422, Fat id: 5  D:58598.74482048422, Fat id: 7  D:58598.74482048422, Fat id: 10  D:58598.74482048422, Fat id: 22  D:58598.74482048422, Fat id: 19  D:58598.74482048422, Fat id: 1  D:58598.74482048422, Fat id: 20  D:58598.74482048422, Fat id: 12  D:58598.74482048422, Fat id: 2  D:58598.74482048422, Fat id: 14  D:58598.74482048422, Fat id: 3  D:58598.74482048422, Fat id: 9  D:58598.74482048422]
java.lang.InterruptedException
at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(Unknown Source)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(Unknown Source)
at java.util.concurrent.Semaphore.acquire(Unknown Source)
at com.test.concurrent.Pool.checkOut(SemaphoreDemo.java:73)
at com.test.concurrent.SemaphoreDemo$1.run(SemaphoreDemo.java:31)
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

Frigate进阶玩法:如何用MQTT和Python脚本扩展你的自定义目标检测算法 本文详细介绍了如何通过MQTT和Python脚本扩展Frigate的自定义目标检测算法,无需修改源码即可实现特殊场景(如工业设备异常、农业病虫害识别)的高效检测。文章涵盖Frigate配置、外部检测服务构建、高级集成技巧及性能优化实践,帮助开发者灵活扩展智能监控能力。 阅读详情

相关推荐

在trae CN中使用conda环境(已解决)

Trae CN 是字节跳动于 2025 年 3 月 3 日发布的国内首个 AI 原生集成开发环境(AI IDE)123。

zwzscnds的博客 6938

如何在Java中实现资源池管理?

资源池管理是一种通过预先分配和复用资源来提高系统效率的设计模式。在Java中,资源可以是数据库连接、线程、文件句柄等。通过维护资源池,系统能够避免频繁地创建和销毁资源,从而降低开销并提高响应速度。首先,我们需要定义资源对象的接口或抽象类,并定义资源池的接口,包括资源的获取、释放等方法。/*** 资源接口*/void use();// 使用资源的方法// 释放资源的方法/*** 资源池接口*/// 获取资源的方法// 释放资源的方法// 关闭资源池的方法。

技术研究中心 723

5G核心网NAS消息解析:从协议字段到实际抓包分析(附Wireshark示例)

本文深入解析5G核心网NAS消息的实战分析方法,从协议字段解读到实际Wireshark抓包诊断。通过详解扩展协议鉴别器、安全头类型、流程事务标识等核心字段,并结合注册流程故障排查实例,指导工程师快速定位NAS层问题,提升5G网络调试与协议分析效率。

grass的博客 532

Java中如何使用线程池

Ta是一种标准的资源池模式将资源的创建和销毁都委托给资源池完成 用户只需要关注取得资源之后自己的核心操作提前预留活跃资源 在用户需要的时候 能够第一时间满足用户对资源的需求 从而让用户感受很好。

追寻心的步伐 574

智能座舱音频系统集成与调试:从芯片选型到音质优化实战

在智能座舱域控制器架构中,音频系统已从简单的功放加扬声器演进为SoC、数字音频总线、外部DSP与多通道功放协同的复杂子系统。TDM总线的时隙分配、PDM麦克风阵列的信号完整性,以及AEC回声消除算法如何与硬件协同,直接决定多音区体验和语音交互的可靠性。工程实践中,音频调试的关键在于先理顺供电、接地、时钟与数据路由,再针对功放削波、采样率失配、TDM slot错位等典型问题进行系统性排查。从芯片选型到系统级指标验收,只有将音频链路视为整车电子电气架构的一个协同整体,才能真正实现从“响”到“好听”的跨越。本文结

weixin_30162121的博客 364

从0到1:.NET 9 OpenAPI全攻略!Swagger vs Scalar UI谁更强?

OpenAPI:.NET 9的智能文档革命 本文深入解析.NET 9的OpenAPI支持,对比Swagger UI与Scalar UI的优劣,提供实战代码示例: 一键生成:AddOpenApi()+MapOpenApi()快速生成标准文档 UI工具对决: Swagger UI功能全面但复杂 Scalar UI简约现代,原生支持cURL/HTTPie 进阶技巧: XML注释增强文档可读性 自定义Transformer实现文档动态修改 🔥核心价值:.NET 9的OpenAPI方案显著降低API文档维护成本,开

java专栏 1428

java对象池化技术

java对象池化技术 https://blog.youkuaiyun.com/tiane5hao/article/details/85957840 文章目录 先写一个简单通用的对象池 通过上面的通用池实现jedis连接池 ...

373

ANPC三电平拓扑:两种调制方式解析

ANPC结构是基于“I”型NPC结构(下面讲NPC如不特殊说明,均指的是“I”型结构NPC)发展出来的一种改进型。我们在讲NPC结构的时候会谈到他的一个缺点就是损耗分布不均匀,会导致温升不均衡,进而限制模块的功率输出能力。而ANPC结构由于多了两个开关管以及相应的两个中性点换流回路(如下图),可以更加灵活任意的配置开关管可以使损耗没有那么的不均衡,从而能一定程度上提高模块的输出功率。ANPC拓扑结构图以及增加的环流回路。

IOTBOT的博客 9487

java 简易的资源池_资源池设计模式 (Resource Pool)和数据池的简单实现

翻译到了一半,感觉还是看原味的比较好点,翻译过的东西和原味的怎么都是有差别。有人想看的话我给贴出来。Object PoolDesign PatternIntentObject pooling can offer a significant performance boost; it is most effective in situations where the cost of initial...

weixin_35867979的博客 668

特斯拉Model 3 BMS主控板拆解:从硬件设计到热管理策略的实战解析

本文深度拆解特斯拉Model 3的BMS主控板,解析其硬件架构与热管理协同策略。文章聚焦于主控板的分区布局、双核MCU的智慧分工,以及从被动监控到主动干预的热管理范式转变,揭示了特斯拉在高压安全、实时控制与系统级工程思维上的设计哲学。

zz67890的博客 594

泛微Ecology流程数据表结构解析:workflow_requestbase和workflow_currentoperator到底怎么关联查询?

本文深入解析泛微Ecology系统中workflow_requestbase和workflow_currentoperator表的结构与关联机制,提供SQL查询语句示例,帮助开发者高效查询流程数据。涵盖待办事项、已办事项、办结事项和流程监控等典型场景,并分享性能优化技巧和常见问题排查指南。

weixin_33738555的博客 815

什么是池,Java中的池有哪些?

1.什么是池,Java中的池有哪些?

qq_44614137的博客 1934

EM的理论与实践(基础篇)

EM理论与实践

m0_61544122的博客 2382

java Semaphore信号亮-同意多个任务同一时候訪问这个资源--thinking in java21.7.6

package org.rui.thread.newc.semaphore; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Semaphore; /** * 同意N个任务同一时候訪问这个资源 * @author lenovo * * @param &lt;T&g...

weixin_33898876的博客 145

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

java Semaphore信号亮-允许多个任务同时访问这个资源--thinking in java21.7.6

java Semaphore信号亮-允许多个任务同时访问这个资源--thinking in java21.7.6

偏执狂才能生存!热忱比专业知识更重要......... 879

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

java:基于LinkedBlockingQueue实现的资源池

假有这样一个需求: 有一组类型为R固定数目的资源对象,多个线程在使用资源对象r时需要申请取用一个资源对象,用完后还回以便其他线程使用。 这个需求很简单,用commons-pool就可以实现,但仅为了这个需求就增加一个jar依赖,有点不划算,所以我基于LinkedBlockingQueue设计了一个资源池对象(resource pool)对象来实现这个需求。 资源池对象有两个基本的方法...

10km的专栏 2553

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

数据库连接池、线程池、常量池 | 资源池化思想

线程池,常量池,连接池, 资源池化思想,如何更加高效的利用资源,初步追源码查看配置

qq_47923467的博客 1516

几个主流的Java连接池整理

池(Pool)技术在一定程度上可以明显优化服务器应用程序的性能,提高程序执行效率和降低系统资源开销。这里所说的池是一种广义上的池,比如数据库连接池、线程池、内存池、对象池等。其中,对象池可以看成保存对象的容器,在进程初始化时创建一定数量的对象。需要时直接从池中取出一个空闲对象,用完后并不直接释放掉对象,而是再放到对象池中以方便下一次对象请求可以直接复用。其他几种池的设计思想也是如此,池技术的优势是

ajian005的专栏 1649

【java】池技术--连接池 线程池 内存池 进程池等汇总分析

网站性能优化:在构建高性能网站时,可以使用 HTTP 连接池、数据库连接池、线程池等池技术,同时结合缓存(如 Redis 缓存、CDN 缓存)、异步编程(如 AJAX、异步 I/O)以及负载均衡(如反向代理、DNS 负载均衡)等技术,共同提高网站性能。大数据处理:在大数据处理场景中,可以使用线程池、进程池等并行计算技术,同时结合资源预留、负载均衡(如 Hadoop 分布式文件系统、Spark 调度器)等技术,以提高数据处理性能和资源利用率。通过限制工作线程或进程的数量,可以实现资源的有效利用和负载均衡。

DreamSun的博客 1740

Java 设计模式系列(7) —— 对象池模式

作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!

smart_an的专栏 603

java基础-资源池模式

资源池模式有通用的几个指标,这也是资源池的通用设计模式,我们以apche-pool连接池为例,观察以下几个指标 setMaxActive Sets the cap on the number of objects that can be allocated by the pool (checked out to clients, or idle awaiting checkout) ...

一个普通程序员的碎碎念 1389

资源池设计模式 (Resource Pool)和数据池的简单实现

本人摘自:http://sourcemaking.com/design_patterns/object_pool Object PoolDesign Pattern Intent Object pooling can offer a significant performance boost; it is most effective in situations where th...

weixin_30325793的博客 679

java 资源池

http://secfree.github.io/blog/2014/12/28/spark-streaming-pool.html https://www.bbsmax.com/A/1O5EpMZaJ7/

JackLi31742的博客 1238

对对象/资源池模式的理论研究

定义: 有时我们的软件项目需要昂贵的对象创建(数据库连接,套接字连接,大型图形对象等)。 此成本可能是关于时间和/或内存的。 这些对象可能还需要经常创建。 那时,对象/资源池模式开始提供帮助。 对象池模式: 重用未使用的昂贵对象,而无需重新创建这些对象(例如,图书馆中的书籍)。 可能在需要它们之前急切地创建对象,以管理应用程序性能。 可能会限制创建的对象数来管理应用程序性能和用...

danpu0978的博客 224

冲浪?在池中游泳

如果将互联网应用比喻成冲浪的话, 可能需要先学会在池中游泳吧。引子AI赋能万物,老码农的伙伴们也曾经开发了一个基于图数据库的知识问答系统,在压力测试的时候发现随着并发数的增加,响应的时延明显变长,看时延分布,是应用程序与图数据库之间的交互时延过长。结构不做调整,优化图数据库后,发现在并发量上来之后,效果仍不明显。 看代码,观察ELK中的日志,发现了问题所在————高并发时连接的创建时间较长。时间所

喔家ArchiSelf 859
上一篇: Thinking in Java学习笔记ScheduledThreadPoolExecutor
下一篇: Thinking in Java学习笔记,使用Exchanger交换资源
fantasyagain
博客等级 码龄19年 18粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值