原创

AQS

在AbstractQueuedSynchronizer类中一共有3个变量

private transient volatile Node head; //头结点
private transient volatile Node tail; //尾结点
private volatile int state; //当前锁有没有被占有

当第一个线程T1进来的时候,会先去判断state看锁有没有其他线程占有,如果没有的话T1就获取到锁的资格,并把state制成占有的状态

第二个线程T2进来的时候,也去判断state看锁有没有被其他线程占有,这个时候锁已经被T1占有了,那么T2就会进行入队操作,这个时候队列还没有初始化,所以会先进行初始化,会先实例化一个空的Node结点,head和tail都指向当前这个空的结点,T2进行入队操作,成为当前队列的第二个结点,tail自动指向第二个结点,第二个结点会进行自旋操作去尝试获取锁(只有第二个结点才会进行自旋),如果获取不到锁则会进行阻塞。

T1已经操作完了就会把state制成未被占有的状态,这个时候就会从尾部遍历队列,找到最前面找到处于正常阻塞的结点,然后唤醒T2,如此反复。

正文到此结束
该篇文章的评论功能已被站长关闭