ConcurrentHashMap源码分析
HashMap、HashTable是JDK中提供的两种的容器,在平时开发中经常会使用到。但在并发编程中,HashMap可能会导致程序死循环,而HashTable就是在所有涉及对该哈希表操作的方法上都加上了synchronized关键字,进行加锁操作。这么做实现了线程安全,但是效率非常低。因此就有了ConcurrentHashMap。
HashMap、HashTable是JDK中提供的两种的容器,在平时开发中经常会使用到。但在并发编程中,HashMap可能会导致程序死循环,而HashTable就是在所有涉及对该哈希表操作的方法上都加上了synchronized关键字,进行加锁操作。这么做实现了线程安全,但是效率非常低。因此就有了ConcurrentHashMap。
在JDK1.6,JDK1.7中,HashMap采用位桶+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里。但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低。而JDK1.8中,HashMap采用位桶+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间。这里就主要研究一下JDK1.8的HashMap源码。
队列同步器,AbstractQueuedSynchronized,简称AQS,是用来构建锁或者其他同步组建的基础框架,常用的有ReentrantLock、ReadWriteLock(实现类ReentrantReadWriteLock),内部实现都依赖于它。Doug Lea大神期望它能够成为实现大部分同步需求的基础。
binder在framework层,采用JNI技术来调用native(C/C++)层的binder架构,从而为上层应用程序提供服务。 看过binder系列之前的文章,我们知道native层中,binder是C/S架构,分为Bn端(Server)和Bp端(Client)。对于java层在命名与架构上非常相近,同样实现了一套IPC通信架构。