上一篇 <<<CountDownLatch同步计数器
下一篇 >>>CyclicBarrier屏障
工作原理
a.可以设置Semaphore信号量的 状态state值为5
b.当一个线程获取到锁的情况下,将state-1,锁释放成功之后state+1;
c.当state<0,表示没锁的资源,则当前线程阻塞。
- 计数信号量-Semaphore
- 多个线程竞争获取许可信号,申请到的做好自己的事情后归还,超过阈值后,线程申请许可信号将会被阻塞
- new Semaphore(3); 总资源数
- wc.acquire();申请资源
- wc.release(); 释放资源
基于AQS手写Semaphore核心代码
/**
* 构造函数设置aqs的state
* @param count state值
*/
public MySemaphore(int count) {
this.sync = new Sync(count);
}
/**
* 重写阻塞的条件,分为公平和非公平,这里只考虑非公平
* 默认设置了state,当有执行的时候,state就会减少,一旦小于0就阻塞,不让继续执行
* @param acquires
* @return
*/
@Override
protected int tryAcquireShared(int acquires) {
for (;;) {
int available = getState();
int remaining = available - acquires;
if (remaining < 0 ||
compareAndSetState(available, remaining)) {
return remaining;
}
}
}
/**
* 使用自旋机制,当执行完后,state会加回去,自动唤醒阻塞队列
* @param releases 步长,正常情况均为1
* @return
*/
@Override
protected boolean tryReleaseShared(int releases) {
for (;;) {
int current = getState();
int next = current + releases;
// 防止溢出
if (next < current) {
throw new Error("Maximum permit count exceeded");
}
if (compareAndSetState(current, next)) {
return true;
}
}
}
相关文章链接:
多线程基础
线程安全与解决方案
锁的深入化
锁的优化
Java内存模型(JMM)
Volatile解决JMM的可见性问题
Volatile的伪共享和重排序
CAS无锁模式及ABA问题
Synchronized锁
Lock锁
AQS同步器
Condition
CountDownLatch同步计数器
CyclicBarrier屏障
线程池
并发队列
Callable与Future模式
Fork/Join框架
Threadlocal
Disruptor框架
如何优化多线程总结
网友评论