- 浏览: 7330347 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (1546)
- 企业中间件 (236)
- 企业应用面临的问题 (236)
- 小布Oracle学习笔记汇总 (36)
- Spring 开发应用 (54)
- IBatis开发应用 (16)
- Oracle基础学习 (23)
- struts2.0 (41)
- JVM&ClassLoader&GC (16)
- JQuery的开发应用 (17)
- WebService的开发应用 (21)
- Java&Socket (44)
- 开源组件的应用 (254)
- 常用Javascript的开发应用 (28)
- J2EE开发技术指南 (163)
- EJB3开发应用 (11)
- GIS&Mobile&MAP (36)
- SWT-GEF-RCP (52)
- 算法&数据结构 (6)
- Apache开源组件研究 (62)
- Hibernate 学习应用 (57)
- java并发编程 (59)
- MySQL&Mongodb&MS/SQL (15)
- Oracle数据库实验室 (55)
- 搜索引擎的开发应用 (34)
- 软件工程师笔试经典 (14)
- 其他杂项 (10)
- AndroidPn& MQTT&C2DM&推技术 (29)
- ActiveMQ学习和研究 (38)
- Google技术应用开发和API分析 (11)
- flex的学习总结 (59)
- 项目中一点总结 (20)
- java疑惑 java面向对象编程 (28)
- Android 开发学习 (133)
- linux和UNIX的总结 (37)
- Titanium学习总结 (20)
- JQueryMobile学习总结 (34)
- Phonegap学习总结 (32)
- HTML5学习总结 (41)
- JeeCMS研究和理解分析 (9)
最新评论
-
lgh1992314:
[u][i][b][flash=200,200][url][i ...
看看mybatis 源代码 -
尼古拉斯.fwp:
图片根本就不出来好吧。。。。。。
Android文件图片上传的详细讲解(一)HTTP multipart/form-data 上传报文格式实现手机端上传 -
ln94223:
第一个应该用排它网关吧 怎么是并行网关, 并行网关是所有exe ...
工作流Activiti的学习总结(八)Activiti自动执行的应用 -
ZY199266:
获取不到任何消息信息,请问这是什么原因呢?
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息 -
xiaoyao霄:
DestinationSourceMonitor 报错 应该导 ...
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息
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; } }
发表评论
-
Mule ESB 学习笔记(20)Mule和Spring httpinvoker的整合
2013-08-28 13:59 3746mule的配置文件: <?xml version=& ... -
Mule ESB 学习笔记(19)Mule和RSS的整合
2013-08-28 10:08 2583定时扫描特定目录的rss文件: <?xml vers ... -
Mule ESB 学习笔记(18)Mule和ATOM的整合
2013-08-27 20:00 2600定时读取特定文件的rss文件: <?xml ... -
Mule ESB 学习笔记(17)Mule和JMX的整合
2013-08-27 16:48 4047Agent的实现: package com.easyway ... -
Mule ESB 学习笔记(16)CXF SOAP基于SAML的验证的配置
2013-08-27 15:19 3788mule的配置 <mule xmlns:core=& ... -
Mule ESB 学习笔记(15)CXF SOAP基于JKS的验证的配置
2013-08-27 14:57 3861mule的配置如下: <mule xmlns:cor ... -
Mule ESB 学习笔记(14)CXF SOAP基于UsernameToken的验证
2013-08-27 14:16 7938简单需求: 针对在webservice ... -
Mule ESB 学习笔记(13)CSV数据文件到数据库
2013-08-26 17:54 7028简单需求: ... -
Mule ESB 学习笔记(12)JSON转换器的使用
2013-08-26 13:54 9075在许多情况下,可能需要把类转换为js ... -
Mule ESB 学习笔记(11)Web Service Proxy
2013-08-24 19:32 6613一、WebSevice Proxy 简介 ... -
Mule ESB 学习笔记(10)mule事务配置
2013-08-23 16:36 6221在mule的事务可能为jdbc事务,jms事务 ... -
Mule ESB 学习笔记(9)mule配置常用节点解释
2013-08-23 13:27 34171 Mule-config.x ... -
Mule ESB 学习笔记(8)mule和jersey的整合使用
2013-08-23 11:20 3931在项目常用jesery作为rest ... -
Mule ESB 学习笔记(7)服务调用
2013-08-23 10:44 18896一. 服务调用 1. Mule实现并提供Web Servi ... -
Mule ESB 学习笔记(6)配置模式
2013-08-23 10:42 4758为了节省时间,就不翻译了,摘抄重点总结 ... -
Mule ESB 学习笔记(5)异步请求-响应方式
2013-08-22 15:32 35735.4 异步请求-响应方式 异步请求-响应方式即请求方调用 ... -
Mule ESB 学习笔记(4)同步方式
2013-08-22 15:19 42335.3 同步方式 同步方式即请求方调用 ... -
JBOSS EJB3项目启动执行一个任务
2013-08-06 22:26 3818在jboss的项目中,jboss启动 ... -
Jboss @Service的使用
2013-08-06 21:59 1976Jboss有一个扩展的annotation——@Servic ... -
julian Date 计算 和实现
2013-08-01 09:32 4429Qt库里CBSDate类的内部实现用_jd成员进行计算、比较 ...
相关推荐
JAVA多线程--信号量(Semaphore) 信号量(Semaphore)是一种多线程环境下的设施,负责协调各个线程,以保证它们能够正确、合理地使用公共资源。从概念上讲,信号量维护了一个许可集。 信号量的类型有两种:单值信号...
在Java多线程编程中,信号量Semaphore是一种非常重要的同步工具,用于控制对公共资源的访问。Semaphore类位于`java.util.concurrent`包下,它允许我们限制同时访问特定资源的线程数量。 ### Semaphore简介 信号量...
本书还涉及到了Java并发工具类,如Semaphore信号量、CyclicBarrier栅栏、CountDownLatch倒计时器等,这些都是Java并发编程中的重要工具,可以帮助开发者更精细地控制线程执行。另外,书中还会介绍如何使用Future和...
Java提供了多种同步机制,如synchronized关键字、Lock接口(ReentrantLock、ReentrantReadWriteLock)以及Semaphore信号量。synchronized用于方法或代码块,可以保证同一时间只有一个线程执行特定代码,避免数据冲突...
在多线程编程中,当多个线程试图同时访问一个有限的资源时,信号量可以帮助我们协调这些线程,确保资源的有序分配和释放。 信号量主要由两个操作组成:`P(Wait)操作`和`V(Signal)操作`。这两个操作通常被封装在...
Java提供了多种同步工具,如synchronized关键字、wait()和notify()方法、Lock接口(包括ReentrantLock可重入锁)以及Semaphore信号量等。这些工具能够确保共享资源在多线程访问时的安全性,防止数据竞争和死锁的发生...
Java提供了多种同步机制,包括synchronized关键字、Lock接口、Semaphore信号量等。synchronized可以修饰方法或代码块,确保同一时间只有一个线程能够执行特定的代码段;Lock接口提供了更灵活的锁机制,如...
3. 线程同步:Java提供了多种同步机制,如synchronized关键字、volatile变量、Lock接口(ReentrantLock等)、Semaphore信号量、CyclicBarrier屏障等,用于解决多线程环境下资源竞争和数据一致性问题。 二、不可变...
Java提供了多种同步机制,如synchronized关键字、wait()和notify()方法、ReentrantLock重入锁、Semaphore信号量等。synchronized用于保证同一时刻只有一个线程访问共享资源,而wait()和notify()用于线程间的通信,...
Java多线程编程是开发高并发应用的关键技术之一,Semaphore工具是Java并发包(java.util.concurrent)中的一个重要组件,用于控制同时访问特定资源的线程数量。本篇将深入讲解Semaphore的基本概念、工作原理以及如何...
Java提供了多种并发控制机制,如synchronized关键字、Lock接口(如ReentrantLock)以及Semaphore(信号量)等,用于控制线程的访问权限和执行顺序。 3. **网络I/O**:Java的`java.net`包提供了处理网络通信的基础...
在"semaphore控制多线程循序执行"的场景中,我们通常会用到计数信号量,它的核心作用是限制同时访问特定资源的线程数量。例如,如果我们要实现一个打印队列,让多个线程按顺序打印任务,Semaphore就可以用来保证打印...
Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过`Thread`类和并发工具来实现,接下来我们将深入探讨这些关键知识点。 1. **...
Java提供了多种同步工具,如synchronized关键字、Lock接口(ReentrantLock、ReadWriteLock等)、Semaphore信号量和CountDownLatch计数器。合理使用这些同步工具可以避免死锁、活锁和饥饿等问题。 五、线程间通信 ...
2. **线程同步**:Java提供了多种线程同步机制,如synchronized关键字、wait/notify机制、Lock接口(ReentrantLock、读写锁等)和Semaphore信号量。这些机制用于避免并发问题,如数据竞争、死锁和活锁等。 3. **...
4. **并发控制**:在多线程环境中,为了保证数据的一致性和避免资源争抢,需要使用并发控制机制,如synchronized关键字、Lock接口、Semaphore信号量等。在端口扫描器中,可能需要这些机制来协调各线程间的操作,确保...
线程同步主要包括synchronized关键字、wait/notify机制、Lock锁(如ReentrantLock)以及Semaphore信号量等,它们用于避免竞态条件,确保共享资源的安全访问。 接着,我们来看Java内存模型(JMM),这是理解多线程...
3. Semaphore:信号量,用于限制同时访问某个资源的线程数量。 4. Executors框架:提供线程池服务,有助于管理和控制线程的生命周期。 六、线程优先级 Java中的线程优先级由Thread类的静态常量定义,如MIN_PRIORITY...
Java提供了多种同步机制,如synchronized关键字、volatile变量、Lock接口(ReentrantLock、ReadWriteLock等)和Semaphore信号量。synchronized提供互斥访问,保证同一时间只有一个线程访问特定代码块;volatile确保...
在这个实例中,我们可能会使用Semaphore(信号量)来模拟筷子,限制同时就餐的哲学家数量,避免死锁。每个哲学家在拿起筷子前都需要获取信号量,用餐完毕后释放信号量,确保资源的公平分配。 此外,我们还可以利用...