随笔分类 - 基础
摘要:前面一篇分析了ReentrantLock的方法和内部类,我们了解到它里面并没有定义state属性、exclusiveOwnerThread属性、acquire方法等,这些都是使用AQS的。本篇着重讲AbstractQueuedSynchronizer的独占锁。一定要看完第一篇,不然很难看明白AbstractQueuedSynchronizer
阅读全文
摘要:AQS听起来很高大上的样子,实际上它就是AbstractQueuedSynchronizer类的缩写,它是构建锁或者其他同步组件的基础框架。在基于AQS构建的同步器中,只能在一个时刻发生阻塞,从而降低上下文切换的开销,提高了吞吐量。同时在设计AQS时充分考虑了可伸缩行,因此J.U.C中所有基于AQS构建的同步器均可以获得这个优势。
阅读全文
摘要:JDK的atomic包中提供了一些简单原子操作类,基本上都是基于volatile+CAS封装,既保证了性能又保证了线程安全。例如平时经常用到的i++多线程场景就可以用AtomicInteger去解决,有ABA强需求的需要谨慎使用,后面会单独写一篇。
阅读全文
摘要:在JAVA中,代理模式应用非常广泛,在很多框架中或平时业务中都经常使用,动态代理其实没什么神秘的,只要搞懂静态代理,在深入思考下,动态代理马上就能搞明白。
阅读全文
摘要:上一篇我们介绍了ConcurrentHashMap的主干方法,本篇是ConcurrentHashMap的终篇,我们主要针对它的元素统计,扩容,元素迁移等做讲解。首先我们回顾一下前面章节,普通节点Hash为key的hash;树节点为TreeBin内部封装红黑树头节点,并且维护树,TreeBin的Hash值为-2;迁移节点ForwardingNode,它的Hash值为-1。在主干方法中对非数组修改都会锁定头节点。
阅读全文
摘要:前面一篇我们介绍了ConcurrentHashMap一些重要的内部类Node 、TreeNode、TreeBin、ForwardingNode,以及ConcurrentMap接口和ConcurrentHashMap的构造函数,本篇主要介绍ConcurrentHashMap的主干方法。
阅读全文
摘要:LinkedTransferQueue 是一个高效阻塞无界链表队列。和SynchronousQueue.TransferQueue(公平模式)相比,它是可以统计长度,可以进行查询的;和LinkedBlockingQueue相比,它拥有更高的性能(使用CAS自旋);和ConcurrentLinkedQueue相比,它拥有阻塞功能。
阅读全文
摘要:SynchronousQueue 没有长度,每一个入队操作必须对应一个出队操作,或者每一个出队操作必须对应一个入栈操作,否则阻塞。SynchronousQueue内部提供两种模式TransferStack非公平模式(LIFO)和TransferQueue公平模式(FIFO)。
阅读全文
摘要:DelayQueue 是JDK中提供的延时队列,内部封装优先级队列,并且提供空阻塞功能。DelayQueue中所有元素必须实现Delayed接口getDelay方法,此方法返回剩余有效时间。
阅读全文
摘要:Java是面向对象语言,在使用Java编程时,大多数情况下都不会直接操作内存,而且Java也不提倡直接操作内存,但是Java中到底有没有可以直接操作内存的工具类呢?有!Java中提供Unsafe类可以用来来直接操作内存。
阅读全文
摘要:ConcurrentHashMap是一个经常被使用的数据结构,它在线程安全的基础上提供了更好的写并发能力。ConcurrentHashMap跟Map有很大的不同,内部大量使用volatile和CAS等减少锁竞争,当然代码也比HashMap难理解的多,本章基于JDK1.8对ConcurrentHashMap做基本介绍,后续章节一步步深入。
阅读全文
摘要:LinkedBlockingDeque 是阻塞双向链表队列,它是线程安全的,除了提供两端读写操作外,还具有阻塞功能。内部使用一把锁,在读写操作前必须获取锁,并且每次都是锁整个链表。
阅读全文
摘要:ConcurrentLinkedDeque是线程安全的非阻塞队列,内部结构跟LinkedBlockingQueue一样使用双向链表,最大的区别就是LinkedBlockingDeque使用CSA原则操作,没有用lock。使用它的时候一样需要注意,头节点和尾节点不保证一定是头和尾。
阅读全文
摘要:ConcurrentLinkedQueue 是线程安全的非阻塞队列,内部是单向链表。ConcurrentLinkedQueue 使用CAS机制保证线程安全,而LinkedBlockingQueue使用两个lock保证线程安全,ConcurrentLinkedQueue 性能比LinkedBlockingQueue高很多。需要注意的是ConcurrentLinkedQueue 的头节点和尾节点都具有滞后性,直接读取不应当准确,不能直接使用,一般需要遍历。
阅读全文
摘要:PriorityBlockingQueue 是优先级阻塞队列,虽然我们称它为无界,实际上它也是有界的。它跟PriorityQueue 最大的区别在于他是线程安全的,在入队出队时使用同一把锁,在扩容时先解锁,再使用cas原子操作,再重新获取锁。
阅读全文
摘要:LinkedBlockingQueue 是一个基于链表的有限队列(理论上它是无限的)。只支持一段入队,另一端出队。无阻塞对应LindedList,它们除了一个线程安全一个线程不安全以外,最大的区别是LinkedList可以放null值。
阅读全文
摘要:ArrayBlockingQueue是一个由数组结构组成的有界队列。此队列按照先进先出的顺序进行排序。支持公平锁和非公平锁,默认非公平锁。
阅读全文
摘要:Queue、Deque 前面已经分析过,它们不是线程安全的,如果非要在多线程中使用Queue或Deque,那么只能把整个队列对象锁住,操作完成在释放锁,这样非常消耗性能,就算多个线程操作不同的元素也要锁整个队列想想都恐怖,有没有更好的办法?JDK中提供了阻塞队列BlockingQueue、BlockingDeque专门用来解决多线程使用队列问题。
阅读全文
摘要:优先级队列只支持从一段取数据,内部结构是数组,但是必须符合二叉堆,每次取数据都会伴随上移下移,如果我们元素不不需要排序,有没有更好的队列呢?ArrayDeque 就能满足这个需要,并且它可以在两端方数据和取数据,内部也是用数组实现。
阅读全文
摘要:PriorityQueue 一个基于优先级的无界优先级队列。优先级队列的元素按照其自然顺序进行排序,或者根据构造队列时提供的 Comparator 进行排序,具体取决于所使用的构造方法,每次出队的元素都是优先级最高的元素。该队列不允许使用 null 元素也不允许插入不可比较的对象(没有实现Comparable接口的对象)。
阅读全文

浙公网安备 33010602011771号