package code.concurrency.lock.aqs;
import code.concurrency.lock.cas.UnsafeUtil;
import sun.misc.Unsafe;
import java.util.concurrent.locks.LockSupport;
/**
* 〈队列同步器〉<p>
* 〈功能详细描述〉
* SyncQueue: [Head(thread=null)] <--prev [Node] next--> ... [Tail]
* 同步状态,0代表锁未被占用,>=1代表锁已被占用
*
* @author zixiao
* @date 2019/3/14
*/
public class AbstractQueuedSync extends AbstractOwnableSync {
private static final Unsafe unsafe = UnsafeUtil.getUnsafe();
private static final long stateOffset;
private static final long headOffset;
private static final long tailOffset;
private static final long waitStatusOffset;
private static final long nextOffset;
static {
try {
//AQS
Class aqsClass = AbstractQueuedSync.class;
stateOffset = unsafe.objectFieldOffset(aqsClass.getDeclaredField("state"));
headOffset = unsafe.objectFieldOffset(aqsClass.getDeclaredField("head"));
tailOffset = unsafe.objectFieldOffset(aqsClass.getDeclaredField("tail"));
//node
waitStatusOffset = unsafe.objectFieldOffset(Node.class.getDeclaredField("waitStatus"));
nextOffset = unsafe.objectFieldOffset(Node.class.getDeclaredField("next"));
} catch (Exception ex) { throw new Error(ex); }
}
/**
* head指向同步队列的头部,注意head为空结点,不存储信息
*/
private volatile Node head;
/**
* tail则是同步队列的队尾
*/
private volatile Node tail;
/**
* 同步状态,0代表锁未被占用,>=1代表锁已被占用
*/
private volatile int state;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
/**
* 〈节点〉<p>
*/
static final class Node {
//共享模式
static final Node SHARED = new Node();
//独占模式
static final Node EXCLUSIVE = null;
/**
* 标识线程已处于结束状态
*/
static final int CANCELLED = 1;
/**
* 等待被唤醒状态
*/
static final int SIGNAL = -1;
/**
* 条件状态,
*/
static final int CONDITION = -2;
/**
* 在共享模式中使用表示获得的同步状态会被传播
*/
static final int PROPAGATE = -3;
/**
* 初始化状态
*/
static final int INITIAL = 0;
/**
* 等待状态
* CANCELLED:值为1,在同步队列中等待的线程等待超时或被中断,需要从同步队列中取消该Node的结点,其结点的waitStatus为CANCELLED,即结束状态,进入该状态后的结点将不会再变化。
* SIGNAL:值为-1,被标识为该等待唤醒状态的后继结点,当其前继结点的线程释放了同步锁或被取消,将会通知该后继结点的线程执行。说白了,就是处于唤醒状态,只要前继结点释放锁,就会通知标识为SIGNAL状态的后继结点的线程执行。
* CONDITION:值为-2,与Condition相关,该标识的结点处于等待队列中,结点的线程等待在Condition上,当其他线程调用了Condition的signal()方法后,CONDITION状态的结点将从等待队列转移到同步队列中,等待获取同步锁。
* PROPAGATE:值为-3,与共享模式相关,在共享模式中,该状态标识结点的线程处于可运行状态。
* 0状态:值为0,代表初始化状态。
*/
volatile int waitStatus;
/**
* 请求锁的线程
*/
volatile Thread thread;
/**
* 同步队列中前继节点
*/
volatile Node prev;
/**
* 同步队列中后继节点
*/
volatile Node next;
/**
* 等待队列中的后继结点,与Condition有关
*/
Node nextWaiter;
/**
* 判断是否为共享模式
*/
final boolean isShared() {
return nextWaiter == SHARED;
}
final Node predecessor() throws NullPointerException {
Node p = prev;
if (p == null) {
throw new NullPointerException();
}else {
return p;
}
}
Node() {
}
Node(Thread thread, Node mode) { // Used by addWaiter
this.nextWaiter = mode;
this.thread = thread;
}
Node(Thread thread, int waitStatus) { // Used by Condition
this.waitStatus = waitStatus;
this.thread = thread;
}
@Override
public String toString() {
return "Node{" +
"waitStatus=" + waitStatus +
", thread=" + thread +
'}';
}
}
protected final boolean compareAndSetState(int expect, int update) {
return unsafe.compareAndSwapInt(this, stateOffset, expect, update);
}
private final boolean compareAndSetHead(Node expect, Node update) {
return unsafe.compareAndSwapObject(this, headOffset, expect, update);
}
private final boolean compareAndSetTail(Node expect, Node update) {
return unsafe.compareAndSwapObject(this, tailOffset, expect, update);
}
private final boolean compareAndSetWaitStatus(Node node, int expect, int update) {
return unsafe.compareAndSwapInt(node, waitStatusOffset, expect, update);
}
private final boolean compareAndSetWaitNext(Node node, int expect, int update) {
return unsafe.compareAndSwapObject(node, nextOffset, expect, update);
}
/**
* 请求锁
* @param arg 锁数量
*/
public final void acquire(int arg) {
//尝试获取锁
if(tryAcquire(arg)){
return;
}
//放入等待队列
Node waiter = addWaiter(Node.EXCLUSIVE);
//队列中自旋获取锁,并在合适的位置park
if (acquireQueued(waiter, arg)){
//设置 等待过程中的 中断
interruptSelf();
}
}
/**
* 插入到队尾
* @param mode
* @return
*/
private Node addWaiter(Node mode) {
Node node = new Node(Thread.currentThread(), mode);
Node currentTail = tail;
if(currentTail != null){
node.prev = currentTail;
if(compareAndSetTail(currentTail, node)){
currentTail.next = node;
return node;
}
}
enq(node);
return node;
}
/**
* CAS放到队尾
* @param node
* @return 前继节点
*/
private Node enq(Node node) {
for (;;){
Node t = tail;
//初始化
if(t == null){
if(compareAndSetHead(null, new Node())){
tail = head;
}
}else{
if(compareAndSetTail(t, node)){
node.prev = t;
t.next = node;
return t;
}
}
}
}
public final void acquireInterruptibly(int arg) throws InterruptedException {
if (Thread.interrupted()){
throw new InterruptedException();
}
if (tryAcquire(arg)){
return;
}
//放入等待队列
Node waiter = addWaiter(Node.EXCLUSIVE);
//队列中自旋获取锁,并在合适的位置park,可被中断
acquireQueuedInterruptibly(waiter, arg);
}
/**
* 重新设置 等待过程的中断
*/
private void interruptSelf(){
Thread.currentThread().interrupt();
}
/**
* 队列中自旋排队申请锁
* 1、如果第一个前继为head,且�
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树)、图结构(有向图、无向图等)以及集合和队列等抽象数据类型。 存储结构(物理结构):描述数据在计算机中如何具体存储。例如,数组的连续存储,链表的动态分配节点,树和图的邻接矩阵或邻接表表示等。 基本操作:针对每种数据结构,定义了一系列基本的操作,包括但不限于插入、删除、查找、更新、遍历等,并分析这些操作的时间复杂度和空间复杂度。 算法: 算法设计:研究如何将解决问题的步骤形式化为一系列指令,使得计算机可以执行以求解问题。 算法特性:包括输入、输出、有穷性、确定性和可行性。即一个有效的算法必须能在有限步骤内结束,并且对于给定的输入产生唯一的确定输出。 算法分类:排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法,分支限界法等。 算法分析:通过数学方法分析算法的时间复杂度(运行时间随数据规模增长的速度)和空间复杂度(所需内存大小)来评估其效率。 学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。
资源推荐
资源详情
资源评论
收起资源包目录
算法, 数据结构, 多线程, 缓存, 分布式事务, 一致性协议, RPC等实现.zip (439个子文件)
.gitignore 320B
code.serialize.ISerializer 122B
AbstractQueuedSync.java 15KB
BufferedRandomAccessFile.java 13KB
HttpClientBuilder.java 12KB
ExcelExportUtils.java 11KB
CatSortCommand.java 10KB
AppendEntriesSender.java 10KB
ExtensionLoader.java 10KB
BPlusTree.java 9KB
WordCountMain.java 9KB
CatSortCommand2.java 8KB
RaftNode.java 8KB
ClassIntrospector.java 7KB
ElectionService.java 7KB
DateFormatUtils.java 7KB
LRUCache.java 6KB
AppendEntriesHandler.java 6KB
AtTransactionCoordinator.java 6KB
CircularQueue.java 6KB
HashMap.java 6KB
TrieChinese.java 6KB
RequestVoteHandler.java 6KB
ZooKeeperLock.java 6KB
ParallelExecuteTest.java 5KB
ConcurrentTest.java 5KB
MurmurHash.java 5KB
SingleLinkedList.java 5KB
P432.java 5KB
ThreadState.java 5KB
P355.java 5KB
NonBlockingLock.java 5KB
TccTxCoordinator.java 5KB
SimpleResourceManager.java 5KB
BinarySearchTree.java 5KB
RaftNodeServer.java 5KB
RedisTokenBucket.java 5KB
NettyClient.java 5KB
ReentrantLock.java 5KB
PipelineTest.java 5KB
RedisLock.java 5KB
KvTest.java 5KB
TianjiRace.java 5KB
SingleLinkedListTest.java 4KB
IdWorker.java 4KB
P707.java 4KB
ConcurrentHashSet.java 4KB
TccFlowHandler.java 4KB
ObjectInfo.java 4KB
LogModule.java 4KB
ExcelExportTest.java 4KB
WrappedHttpClient.java 4KB
AsyncHttpClientTest.java 4KB
NetworkUtils.java 4KB
KvClient.java 4KB
HttpNettyServerHandler.java 4KB
LogEventTest.java 4KB
CacheHotKey.java 4KB
KMPMatcher.java 4KB
CacheSnowCrash.java 4KB
Trie.java 3KB
Account.java 3KB
P297.java 3KB
CatSortTest.java 3KB
TokenBucket.java 3KB
CacheTest.java 3KB
TccInterceptor.java 3KB
LeakyBucket.java 3KB
Client.java 3KB
ConsistentHash.java 3KB
HttpClientTest.java 3KB
HttpNettyServer.java 3KB
MqClient.java 3KB
ConcurrentExecutor.java 3KB
P460.java 3KB
P394.java 3KB
DiskClassLoader.java 3KB
SimpleCache.java 3KB
WheelTimer.java 3KB
AbstractFuture.java 3KB
ConstantSpeedLimiter.java 3KB
MutilThreadPrinter.java 3KB
IndexNode.java 3KB
LockManager.java 3KB
RingBuffer.java 3KB
ReentrantLockTest.java 3KB
NettyServer.java 3KB
SnapshotUtils.java 3KB
UserBasedRecommend.java 3KB
TradeService.java 3KB
NettyServerHandler.java 3KB
RaftClusterManager.java 3KB
MinArray.java 3KB
SlidingWindow.java 3KB
P994.java 3KB
BinarySearch.java 3KB
P295.java 3KB
ListQueue.java 3KB
TransferMoneyServiceTest.java 2KB
CachePenetrate.java 2KB
共 439 条
- 1
- 2
- 3
- 4
- 5
资源评论
极致人生-010
- 粉丝: 4375
- 资源: 3087
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功