1. 重入锁的概念与作用       reentrant 锁意味着什么呢?简单来说,它有一个与获取锁相关的计数器,如果已占有锁的某个线程再次获取锁,那么lock方法中将计数器就加1后就会立刻返回.当释放锁时计数器减1,若计数器不为0,说明线程仍然占有锁:若计数器值为0,线程才会真正释放锁. 可重入锁可以避免同一个线程嵌套(或者说递归)获取锁时的死锁现象. 考虑下面这样一种情况 public class LockAnalysis { private Lock l = new ReentrantLo…
1.特点 ReentrantLock能够实现共享资源的互斥访问,但是它在某些条件下效率比较低下.比如,多个线程要查询(或者说读取)某列车的余票数,如果使用ReentrantLock,那么多个线程的查询操作只能互斥,也就是说一个线程查询完成,下一个线程才能查询.考虑到读取操作并不会改变数据的值,如果能够并发的进行读取访问,既可以得到正确的结果也能提高效率.但是,当某个线程要进行购票或者退票操作时(也就是写操作),这个时候就需要线程间的互斥,购票或者退票操作必须等待所有查询操作完成以后才能执行(同理…
在上一篇<Java并发系列[1]----AbstractQueuedSynchronizer源码分析之概要分析>中我们介绍了AbstractQueuedSynchronizer基本的一些概念,主要讲了AQS的排队区是怎样实现的,什么是独占模式和共享模式以及如何理解结点的等待状态.理解并掌握这些内容是后续阅读AQS源码的关键,所以建议读者先看完我的上一篇文章再回过头来看这篇就比较容易理解.在本篇中会介绍在独占模式下结点是怎样进入同步队列排队的,以及离开同步队列之前会进行哪些操作.AQS为在独占模…
概述 前文「JDK源码分析-AbstractQueuedSynchronizer(1)」初步分析了 AQS,其中提到了 Node 节点的「独占模式」和「共享模式」,其实 AQS 也主要是围绕对这两种模式的操作进行的. Node 节点是对线程 Thread 类的封装,因此两种模式可以理解如下: 独占模式(exclusive):线程对资源的访问是排他的,即某个时间只能一个线程单独访问资源: 共享模式(shared):与独占模式不同,多个线程可以同时访问资源. 本文先分析独占模式下的各种操作,后面再分…
关于AbstractQueuedSynchronizer JDK1.5之后引入了并发包java.util.concurrent,大大提高了Java程序的并发性能.关于java.util.concurrent包我总结如下: AbstractQueuedSynchronizer是并发类诸如ReentrantLock.CountDownLatch.Semphore的核心 CAS算法是AbstractQueuedSynchronizer的核心 可以说AbstractQueuedSynchronizer是…
关于AbstractQueuedSynchronizer JDK1.5之后引入了并发包java.util.concurrent,大大提高了Java程序的并发性能.关于java.util.concurrent包我总结如下: AbstractQueuedSynchronizer是并发类诸如ReentrantLock.CountDownLatch.Semphore的核心 CAS算法是AbstractQueuedSynchronizer的核心 可以说AbstractQueuedSynchronizer是…
本文基于JDK-8u261源码分析 相信大部分人知道AQS是因为ReentrantLock,ReentrantLock的底层是使用AQS来实现的.还有一部分人知道共享锁(Semaphore/CountDownLatch/CyclicBarrier)也是由AQS来实现的.也就是说AQS中有独占和共享两种模式.但你以为这就是AQS的全部了吗?其实不然.AQS中还有第三种模式:条件队列.像Java中的阻塞队列(ArrayBlockingQueue.LinkedBlockingQueue等)就是由AQS…
刚刚看完了并发实践这本书,算是理论具备了,看到了AQS的介绍,再看看源码,发现要想把并发理解透还是很难得,花了几个小时细分析了一下把可能出现的场景尽可能的往代码中去套,还是有些收获,但是真的很费脑,还是对多线程的理解太浅了,不多说了,直接上代码吧. 这段代码不是为跑通,只是把AQS,ReentrantLock中的部分源码合并到了一起,便于理解. package com.yb.interview.concurrent; import java.util.concurrent.locks.LockS…
首先我们从java.util.concurrent.locks包中的AbstraceQueuedSynchronizer说起,在下文中称为AQS. AQS是一个用于构建锁和同步器的框架.例如在并发包中的ReentrantLock.Semaphore.CountDownLatch.ReentrantReadWriteLock等都是基于AOS构建,这些锁都有一个特点,都不是直接扩展自AQS,而是都有一个内部类继承自AQS.为什么会这么设计而不是直接继承呢?简而言之,锁面向的是使用者,同步器面向的是线…
通过上一篇的分析,我们知道了独占模式获取锁有三种方式,分别是不响应线程中断获取,响应线程中断获取,设置超时时间获取.在共享模式下获取锁的方式也是这三种,而且基本上都是大同小异,我们搞清楚了一种就能很快的理解其他的方式.虽然说AbstractQueuedSynchronizer源码有一千多行,但是重复的也比较多,所以读者不要刚开始的时候被吓到,只要耐着性子去看慢慢的自然能够渐渐领悟.就我个人经验来说,阅读AbstractQueuedSynchronizer源码有几个比较关键的地方需要弄明白,分别是…