Java中关于AbstractQueuedSynchronizer的入门(二)

AQS是一个同步器的基础类,里面的关键字段:

    //如下关键字段都是volatile类型

    /**
     * Head of the wait queue, lazily initialized.  Except for
     * initialization, it is modified only via method setHead.  Note:
     * If head exists, its waitStatus is guaranteed not to be
     * CANCELLED.
     */
    private transient volatile Node head; //获取锁的链式队列的头

    /**
     * Tail of the wait queue, lazily initialized.  Modified only via
     * method enq to add new wait node.
     */
    private transient volatile Node tail;//获取锁的链式队列的尾

    /**
     * The synchronization state.
     */
    private volatile int state; //记录所的状态

 

通过如下示例代码进行跟踪查看队列实际细节:

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class AQS {
    public static void main(String[] args) throws Exception {

        final Lock lock = new ReentrantLock();

        lock.lock();
        lock.lock();
        newThread(lock,"lock-1").start();
        Thread.sleep(500);
        newThread(lock,"lock-2").start();
        Thread.sleep(500);
        newThread(lock,"lock-3").start();
        Thread.sleep(500);
     //断点处,可以在此处进行跟踪
        lock.lock();
        
        Thread.sleep(5000000);
        lock.unlock();
        lock.unlock();
        lock.unlock();

    }

    public static Thread newThread(final Lock lock,final String threadName ) {
        return new Thread(new Runnable() {

            @Override
            public void run() {
                System.out.println(threadName+"正在获取锁!");
                lock.lock();
            }
        },threadName);

    }

}

注意类的继承细节:

abstract static class Sync extends AbstractQueuedSynchronizer 
static final class NonfairSync extends Sync 

此时细节:

三个线程lock-1,lock-2,lock-3正在队列中等待获取锁。

 

 

接下来查看一下lock-1如何存储到等待队列中的:

 

转载于:https://www.cnblogs.com/leodaxin/p/7701429.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值