多线程与高并发5-AQS

AQS

1、state和共同操作该state的双向链表。
在这里插入图片描述
2、双向链表用于查看前一节点状态
3、CAS+Volitile state(通过head获取当前状态,tail添加队列元素)
4、state是volitile修饰的,设置state方法,有setState()和compareAndState()[unsafe];
5、AQS主要方法:tryAcquire,tryRelease,tryAcquireShared,tryReleaseShared,isHeldExclusively

//reentrantLock
final boolean nonfairTryAcquire(int acquires) {
            final Thread current = Thread.currentThread();
            int c = getState();//获取state
            if (c == 0) {
                if (compareAndSetState(0, acquires)) {//CAS
                    setExclusiveOwnerThread(current);
                    return true;
                }
            }
            else if (current == getExclusiveOwnerThread()) {//重入
                int nextc = c + acquires;
                if (nextc < 0) // overflow
                    throw new Error("Maximum lock count exceeded");
                setState(nextc);
                return true;
            }
            return false;
        }
//aqs
 private Node addWaiter(Node mode) {
        Node node = new Node(Thread.currentThread(), mode);//mode,exclusive,Shared
        // Try the fast path of enq; backup to full enq on failure
        Node pred = tail;
        if (pred != null) {
            node.prev = pred;
            if (compareAndSetTail(pred, node)) {//cas自旋锁插入到链表最后一个节点
                pred.next = node;
                return node;
            }
        }
        enq(node);
        return node;
    }
final boolean acquireQueued(final Node node, int arg) {
        boolean failed = true;
        try {
            boolean interrupted = false;
            for (;;) {
                final Node p = node.predecessor();//获取前置节点(双向链表)
                if (p == head && tryAcquire(arg)) {//头结点,尝试拿到锁
                    setHead(node);
                    p.next = null; // help GC
                    failed = false;
                    return interrupted;
                }
                if (shouldParkAfterFailedAcquire(p, node) &&
                    parkAndCheckInterrupt())//阻塞
                    interrupted = true;
            }
        } finally {
            if (failed)
                cancelAcquire(node);
        }
    }

获得锁
在这里插入图片描述
释放锁
AQS,release->tryRelease,尝试释放通过state-1,state如果为零释放

发布了25 篇原创文章 · 获赞 0 · 访问量 582

猜你喜欢

转载自blog.csdn.net/RaymondCoder/article/details/105089642