Semaphore (通常用于限制可以访问某些资源(物理或逻辑的)的线程数目)
2013-08-02 22:01
656 查看
Semaphore 通常用于限制可以访问某些资源(物理或逻辑的)的线程数目。例如,下面的类使用信号量控制对内容池的访问:
方法详解:
//API中示例代码
方法详解:
构造方法摘要 |
---|
Semaphore(int permits) 创建具有给定的许可数和非公平的公平设置的 Semaphore。 |
Semaphore(int permits,boolean fair) 创建具有给定的许可数和给定的公平设置的 Semaphore。 |
方法摘要 | |
---|---|
void | acquire() 从此信号量获取一个许可,在提供一个许可前一直将线程阻塞,否则线程被中断。 |
void | acquire(int permits) 从此信号量获取给定数目的许可,在提供这些许可前一直将线程阻塞,或者线程已被中断。 |
void | acquireUninterruptibly() 从此信号量中获取许可,在有可用的许可前将其阻塞。 |
void | acquireUninterruptibly(int permits) 从此信号量获取给定数目的许可,在提供这些许可前一直将线程阻塞。 |
int | availablePermits() 返回此信号量中当前可用的许可数。 |
int | drainPermits() 获取并返回立即可用的所有许可。 |
protected Collection<Thread> | getQueuedThreads() 返回一个 collection,包含可能等待获取的线程。 |
int | getQueueLength() 返回正在等待获取的线程的估计数目。 |
boolean | hasQueuedThreads() 查询是否有线程正在等待获取。 |
boolean | isFair() 如果此信号量的公平设置为 true,则返回 true。 |
protectedvoid | reducePermits(int reduction) 根据指定的缩减量减小可用许可的数目。 |
void | release() 释放一个许可,将其返回给信号量。 |
void | release(int permits) 释放给定数目的许可,将其返回到信号量。 |
String | toString() 返回标识此信号量的字符串,以及信号量的状态。 |
boolean | tryAcquire() 仅在调用时此信号量存在一个可用许可,才从信号量获取许可。 |
boolean | tryAcquire(int permits) 仅在调用时此信号量中有给定数目的许可时,才从此信号量中获取这些许可。 |
boolean | tryAcquire(int permits, long timeout, TimeUnit unit) 如果在给定的等待时间内此信号量有可用的所有许可,并且当前线程未被中断,则从此信号量获取给定数目的许可。 |
boolean | tryAcquire(long timeout, TimeUnit unit) 如果在给定的等待时间内,此信号量有可用的许可并且当前线程未被中断,则从此信号量获取一个许可。 |
class Pool {
private static finalint MAX_AVAILABLE = 100;
private final Semaphore available = new Semaphore(MAX_AVAILABLE, true);
public Object getItem() throws InterruptedException {
available.acquire();
return getNextAvailableItem();
}
publicvoid 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
protectedboolean[] used = newboolean[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 synchronizedboolean 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;
}
}
相关文章推荐
- (C#) 线程操作 - 限制可同时访问某一资源或资源池的线程数。Semaphore 类。Mutex类
- C#多线程编程之:使用Semaphore类限制资源并发访问数
- 多线程Demo-Semaphore 控制同时访问资源的线程个数
- java基于AbstractQueuedSynchronizer实现资源共享锁,限制并发线程数目
- OMCAT中可以限制某些IP访问
- Java多线程指定资源可以被多少个线程同时访问
- 使用Semaphore限制资源并发访问的线程数
- 如何确保N个线程可以访问N个资源同时又不导致死锁
- Java并发编程: 使用Semaphore限制资源并发访问的线程数
- Java中的Semaphore--用于多线程中控制资源并发访问的线程数
- 【Java多线程】使用Semaphore限制资源访问的线程数
- Spring MVC框架下在java代码中访问applicationContext.xml文件中配置的文件(可以用于读取配置文件内容)
- linux下使用线程锁互斥访问资源
- 在https的tomcat环境中,使某些特殊的资源通过http来访问
- spring如何可以同时访问静态资源和Action
- 控制并发访问资源 -- Semaphore
- 拦截器、执行-拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。-by小雨
- [httpd.conf]Apache发布的网站限制某些网段的访问方法
- apache2.2.8 使用 mod_limitipconn 限制用户下载使用线程数目
- Java: 使用信号量(Semaphore)保护多个共享资源的访问