Semaphore (信号量)管理访问数据的线程个数
2011-09-21 21:10
197 查看
一个计数信号量。从概念上讲,信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个release() 添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore 只对可用许可的号码进行计数,并采取相应的行动。
使用:Semaphore available = new Semaphore(3);
创建了只能三个线程访问的信号量
获得许可:available.acquire();
释放许可:available.release();
这两句代码放到操作的数据对象当中,只维护可以有几个线程同时访问程序代码;
可以用单个信号量实现同步,这个同步和其他同步有所不同,不会产生死锁。
将信号量初始化为 1,使得它在使用时最多只有一个可用的许可,从而可用作一个相互排斥的锁。这通常也称为二进制信号量,因为它只能有两种状态:一个可用的许可,或零个可用的许可。按此方式使用时,二进制信号量具有某种属性(与很多
下面是API上的例子:
使用:Semaphore available = new Semaphore(3);
创建了只能三个线程访问的信号量
获得许可:available.acquire();
释放许可:available.release();
这两句代码放到操作的数据对象当中,只维护可以有几个线程同时访问程序代码;
可以用单个信号量实现同步,这个同步和其他同步有所不同,不会产生死锁。
将信号量初始化为 1,使得它在使用时最多只有一个可用的许可,从而可用作一个相互排斥的锁。这通常也称为二进制信号量,因为它只能有两种状态:一个可用的许可,或零个可用的许可。按此方式使用时,二进制信号量具有某种属性(与很多
Lock实现不同),即可以由线程释放“锁”,而不是由所有者(因为信号量没有所有权的概念)。在某些专门的上下文(如死锁恢复)中这会很有用。
下面是API上的例子:
Semaphore 通常用于限制可以访问某些资源(物理或逻辑的)的线程数目。例如,下面的类使用信号量控制对内容池的访问: class Pool { private static final int MAX_AVAILABLE = 100; private final Semaphore available = new Semaphore(MAX_AVAILABLE, true); public Object getItem() throws InterruptedException { available.acquire(); return getNextAvailableItem(); } public void putItem(Object x) { if (markAsUnused(x)) available.release(); } // Not a particularly efficient data structure; just for demo protected Object[] items = ... whatever kinds of items being managed protected boolean[] used = new boolean[MAX_AVAILABLE]; 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 } 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; } } 获得一项前,每个线程必须从信号量获取许可,从而保证可以使用该项。该线程结束后,将项返回到池中并将许可返回到该信号量,从而允许其他线程获取该项。注意,调用 acquire() 时无法保持同步锁,因为这会阻止将项返回到池中。信号量封装所需的同步,以限制对池的访问,这同维持该池本身一致性所需的同步是分开的。
相关文章推荐
- JDK并发包---(7)允许多个线程同时访问的:信号量(Semaphore)
- Linux——线程信号量 读写锁 线程的私有数据
- 关于tensorflow 的数据读取线程管理QueueRunner
- linux线程数据及信号量详解
- java,线程操作,同步访问共享的可变数据
- 2.[个人]C++线程入门到进阶(2)----线程同步之信号量(semaphore)
- Spring 框架参考文档(四)-数据访问之(事务管理)
- java基础--线程04--多个线程访问共享对象和数据的方式
- WPF跨线程访问线程安全的数据(如解决:该类型的CollectionView不支持从调度程序线程以外的线程对其SourceCollection)
- [笔记][Java7并发编程实战手册]3.2 资源的并发访问控制Semaphore信号量
- 多个线程访问共享对象和数据的方式
- 线程同步(信号量,互斥,条件变量) 分类: linux应用程序 2008-04-08 09:43 2587人阅读 评论(1) 收藏 举报 进行多线程编程,最头疼的就是那些共享的数据。因为你无法知道哪个线程会在哪个时候对它进行操作,你也无法
- 传统对数据访问与主数据管理(MDM)
- java多线程与线程并发五:多个线程访问共享对象和数据的方式
- 多线程六 经典线程同步之信号量Semaphore
- iOS 关于dispatch_semaphore_t(信号量) 和 dispatch_group_t (组) 线程执行顺序的使用
- python基础-信号量Semaphore(进程_线程)、事件Event(进程_线程)
- mutex线程控制和信号量semaphore
- 线程之间的信号量 Semaphore
- 线程之三个小面试题 并发集合数据的访问 阻塞队列