多线程学习第七课

1、AQS

1、概念:AQS 核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒 时锁分配的机制,这个机制 AQS 是用 CLH 队列锁实现的,即将暂时获取不到锁的线程加入到队列中。
2、简单的AQS图解:

多线程学习第七课_第1张图片

3、实现案例

多线程学习第七课_第2张图片

4、AQS 使用一个 int 成员变量state来表示同步状态,这个成员变量是volatitlex修饰的,通过内置的 FIFO 队列来完成获取资源线程的排队工作。AQS 使用 CAS 对该同步状态进行原子操作实现对其值的修改。
// 定义共享资源状态
private volatile int state;

// 获取共享资源的状态
protected final int getState() {
        return state;
    }
// 设置共享资源的状态
protected final void setState(int newState) {
        state = newState;
    }
// CAS竞争state
protected final boolean compareAndSetState(int expect, int update) {
        // See below for intrinsics setup to support this
        return unsafe.compareAndSwapInt(this, stateOffset, expect, update);
    }
以ReentrantLock为例,state初始化为0,表示未锁定状态。
A线程lock时,会调用tryAcquire独占该锁并将state+1。此后,其他线程再tryAcquire时就会失败,直到A线程unlock到state=0(即释放锁)为止,其它线程才有机会获取该锁。
当然,释放锁之前,A线程自己是可以重复获取此锁的(state会累加),这就是可重入的概念。但要注意,获取多少次就要释放多么次,这样才能保证state是能回到零态的。

你可能感兴趣的