同步器 一般与一组线程对象使用,它维护一个状态,根据它的状态,它让一个线程通过或强迫线程等待。
1.Semaphore是一个经典的并发工具,通常用于限制可以访问某些资源(物理或逻辑的)的线程数目。
class Pool {
private static final int MAX_AVAILABLE = 100;//许可数
private final Semaphore available = new Semaphore(MAX_AVAILABLE, true);//创建具有给定的许可数和给定的公平设置的Semaphore。
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;
}
}
[1].信号量(控制访问资源的线程数量)