ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

AQS的理解

AQS的理解 问题1什么是AQS作用是什么AQS是线程同步管理框架提供一套通用的线程等待、唤醒、锁竞争机制问题2AQS的组成包含哪些内容state状态标记CLH队列每个节点对象中保存的是线程问题3AQS独占锁的获取流程线程调用lock()获取独占锁首先执行一次CAS尝试将state的值从0修改为1成功修改将当前线程设置为持有锁线程获取锁成功修改失败说明当前锁被占用进而调用AQS的acquire(1)方法继续竞争acquire()方法内部先调用tryAcquire()方法非公平锁最终执行nonfairTryAcquire()继续判断当前state是否为0如果为0再次通过CAS修改state的值CAS成功将当前线程设置为独占线程获取锁成功CAS失败锁被其他线程占用获取锁失败state的值不为0判断当前线程是否为独占线程如果是累加state计数就获取锁成功如果不是获取锁失败如果tryAcquire()返回false执行addWaiter(),将当前线程封装为独占模式的Node节点通过CAS放入到双向同步队列的尾部紧接着执行acquireQueued(),循环判断当前节点的前驱节点是否为head头节点如果是则再次调用tryAcquire()竞争锁抢锁成功将当前节点设置为新head节点抢锁失败等待其他线程线程释放锁后被唤醒。问题4共享模式和独占模式有什么区别共享模式同步状态可以被多个线程同时获取线程持有锁其他线程也可以获取当前锁比如说ReentrantWriteReadLock中的读锁。独占模式同一时间同步状态只能被一个县城占有当某个线程持有锁期间其他线程获取锁都会阻塞问题5AQS的公平锁和非公平锁有什么区别公平锁线程获取锁时若锁空闲判断当前线程是否位于队列头部如果是则允许抢占锁如果不是线程进入队列等待唤醒非公平锁线程直接抢占锁如果锁空闲抢占锁成功锁被别的线程持有抢占锁失败进入等待队列等待被唤醒
返回列表