关于多线程:多线程学习第七课

1、AQS

1、概念:AQS 核心思想是,如果被申请的共享资源闲暇,则将以后申请资源的线程设置为无效的工作线程,并且将共享资源设置为锁定状态。如果被申请的共享资源被占用,那么就须要一套线程阻塞期待以及被唤醒 时锁调配的机制,这个机制 AQS 是用 CLH 队列锁实现的,行将临时获取不到锁的线程退出到队列中。
2、简略的AQS图解:

3、实现案例

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是能回到零态的。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理