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

3次阅读

共计 819 个字符,预计需要花费 3 分钟才能阅读完成。

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