From 8d77986e7cd46a52960283000d56d611ec99ac7a Mon Sep 17 00:00:00 2001 From: guide Date: Fri, 12 Aug 2022 08:57:25 +0800 Subject: [PATCH] =?UTF-8?q?[docs=20update]java=E9=9B=86=E5=90=88=E9=83=A8?= =?UTF-8?q?=E5=88=86=E5=86=85=E5=AE=B9=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../images/types-of-exceptions-in-java.drawio | 2 +- docs/java/basis/java-basic-questions-03.md | 2 +- .../concurrent-hash-map-source-code.md | 70 +++++----- .../images/java-collection-hierarchy.png | Bin 24299 -> 0 bytes .../images/java7_concurrenthashmap.drawio | 1 + .../images/java7_concurrenthashmap.png | Bin 40808 -> 0 bytes .../images/java8_concurrenthashmap.drawio | 1 + .../images/java8_concurrenthashmap.png | Bin 10941 -> 0 bytes .../collection/images/jdk1.7_hashmap.drawio | 1 + .../java/collection/images/jdk1.7_hashmap.png | Bin 17009 -> 0 bytes .../collection/images/jdk1.8_hashmap.drawio | 1 + .../java/collection/images/jdk1.8_hashmap.png | Bin 20258 -> 0 bytes .../collection/images/treemap_hierarchy.png | Bin 8416 -> 0 bytes .../java-collection-questions-01.md | 19 ++- .../java-collection-questions-02.md | 125 +++++++++++------- 15 files changed, 122 insertions(+), 100 deletions(-) delete mode 100755 docs/java/collection/images/java-collection-hierarchy.png create mode 100644 docs/java/collection/images/java7_concurrenthashmap.drawio delete mode 100755 docs/java/collection/images/java7_concurrenthashmap.png create mode 100644 docs/java/collection/images/java8_concurrenthashmap.drawio delete mode 100755 docs/java/collection/images/java8_concurrenthashmap.png create mode 100644 docs/java/collection/images/jdk1.7_hashmap.drawio delete mode 100755 docs/java/collection/images/jdk1.7_hashmap.png create mode 100644 docs/java/collection/images/jdk1.8_hashmap.drawio delete mode 100755 docs/java/collection/images/jdk1.8_hashmap.png delete mode 100755 docs/java/collection/images/treemap_hierarchy.png diff --git a/docs/java/basis/images/types-of-exceptions-in-java.drawio b/docs/java/basis/images/types-of-exceptions-in-java.drawio index 4ca3e86e..9902cfe4 100644 --- a/docs/java/basis/images/types-of-exceptions-in-java.drawio +++ b/docs/java/basis/images/types-of-exceptions-in-java.drawio @@ -1 +1 @@ -7Vtbd6M2EP41PGYPiIvh0XbsbNpkkx6nl32UQVw2MnKFHNv99RUgbED4kqxt3JSThzAjIcF8M6NvJKPow9nqjsJ5+Eg8hBWgeitFv1UA0Bxd5/9SzTrXOE4vVwQ08kSnrWIS/YOEUhXaReShpNKREYJZNK8qXRLHyGUVHaSULKvdfIKrs85hgCTFxIVY1v4ZeSzMtTbobfVfURSExcya5eQtM1h0Fm+ShNAjy5JKHyn6kBLC8qvZaohwarzCLvl94x2tmwejKGbH3ODfjqI7FuNZ3NcfXp71iT7q3xji2di6eGHk8fcXIqEsJAGJIR5ttQNKFrGH0lFVLm37PBAy50qNK38gxtYCTLhghKtCNsOilT8wXf+V3v/FLMTvYrhMuF1VpLWQfBIzMahmcXlj0bQxeUXMDcUMsm2EuRKyoC7aY5DCxyANENvTD+T9UmuVJhCWv0NkhviT8w4UYciit6o3QeGUwaafuLVPKVyXOsxJFLOkNPJzquAdRHzplnAuEV163Qdq/e293flF/gCFVHqTrSpzq3e4mNmGi9Vd5aMu16aL6f9JF7O0FnxMvPQbxAthhpeQ53445d5U976tb6UwLsOIockcZogt+Rq234/8COMhwYRmY+keRLbvpq7BKHlFpRbLtdHU/5gHvSHK0Gov5gU4atXYwBDycrtWacUCFJbWqQLUJjcpQfV+JAC4hnA/R9iCY1cG9dRx+3OA6K0s8auIldItl76XWrbJNhUuubwfDaJ2XSBK+W20ctGcRSQ+b34zke0ZTfnNBlPd+iBKx+c3UFtLrLbTm/VZs9t5yMZBdmCqNaTyyBR31cA6AVHQ5UDiRSI9axD5tovcRpIwtU3D/CDNPD6ITPPaoqgnofCpATCcHU5fAmDD3MoAAPNcCDgSAk8L9uQ/ohmh6+aQ4C/LqmavmjMmMarZXqggjoKYiy43IeL6QWq6yIW4LxpmkedlqbIJ52r6PEEufEfkaGYVOL0hcpwm4M6FW5E+S8D9EVG2gPgRumEUow67XdhZZtvYyVXqhEH39Ym/1BiTZQfdDuishnx5YegMCbr7pw6vHXj1tNbxMg8zDBR7/fSAYAuAB5NwQzlKAKb6Z8g4KHGmAaq+gbU4FACnMfpB/l0yqdlg0UJ3Ypreq9P0vJ6QaPrBgaw6pzwz39dsyRH6SZLGFYm7+N2Vb1unOUYrhwbXfC5VmPrwzpV5ZCa50M6VTFiHIXJfOU5Avcwmlu/7oLn886ypZZ49vG60ev3XsD5uDrwvUoAb3bnvjg3fw/FlXVd8yUXF77F78QhD1o4I6zlT9ewbLJpxbQEGjiCgnyrHAbXGIRo2GZv3uIyzYWBdGoOWowBcHwTyTi+vm3fmpP8h9+YVSq1Cctom30CumYYYJsk3wsapoTr89uHXa714AvLm/uS3hw61vaj12kZNlwulcYRRF3THwGc3HWleFj75ZFlCqttxLM1Q2yi8savkxa4ffR674ygNdOlfGMhHBX0asZCPG7ldFO+p2tpnPrpctWXMZwgT1kG3B7r2SY8uF3v3GKMA4peQIuhNGGSow7CMoXl1FEgmrvfcOqvspymD1FJJh+AeBDdrZnvnNqBjQT/DgoBhfDkRD2oY6nxM6GX44n4N1F9NL/wG2MQfsTVt+ChDGZkKp2f9oTIylMFQcXqZZqwM+MU40/R/gW/wLv3oTwEWTiN6Siv+Y/29SL+Yy0C/STLU+7yDZs1XGcBFO78Ksv+jnjK4VRwtvegPFMfZTPWDT5V9X/jFvdZ8guEU4QF0X4NMX5+8viHJ5dK24yD7y8bkq1+aNBtCohIsOzJQQ8js/sl27bDLAA1JqdcQQtr7kxIXt99P5m67/QpVH/0L \ No newline at end of file +7Vtde6o4EP41XPY8Er4v1WpPd9vT7mP341xGCMJpJG6IVffXb4CgQPCjPSJul6cXZSYhgXlnJu8komjD+fqOwkXwSDyEFdDz1op2qwCgOprG/yWaTaZxHCtTzGjoiU47xST8BwllT2iXoYfiUkdGCGbhoqx0SRQhl5V0kFKyKnfzCS7PuoAzJCkmLsSy9s/QY0GmtYG1039F4SzIZ1ZNJ2uZw7yzeJM4gB5ZFVTaSNGGlBCWXc3XQ4QT4+V2ye4b72ndPhhFETvlBv92FN6xCM+jvvbw8qxNtFH/RhfPxjb5CyOPv78QCWUBmZEI4tFOO6BkGXkoGbXHpV2fB0IWXKly5Q/E2EaACZeMcFXA5li08gemm7+S+78YufhdDJcKt+uStBGSTyImBlVNLm8tmjTGr4i5gZhBto0wV0yW1EUHDJL7GKQzxA70A1m/xFqFCYTl7xCZI/7kvANFGLLwrexNUDjlbNtP3NqnFG4KHRYkjFhcGPk5UfAOIr40UziXiC6t6gOV/vbB7vwie4BcKrzJTpW61TtczGjDxaqu8lGXa9PFtP+ki5lqCz4mXvoN4qUww0vAcz+ccm+qet/OtxIYV0HI0GQBU8RWfA077Ed+iPGQYELTsTQPItt3E9dglLyiQovp2mjqf8yD3hBlaH0Q8xycXtnYQBfyardWqfkCFBTWqRzUOjcpQPV+JAC4hnBvImzBqStD79xx+3OAaK0s8euQFdItl74XWnbJNhEuubyfDKJ6XSBK+W20dtGChSRqNr8ZyPb0uvxmg6lmfhCl0/MbqKwlZtvpzfys2a0ZsnGUHRi9ClJZZIq7KmCdgShociDxIpE2GkS+7SK3liRMbUM3PkgzTw8iw7i2KLIkFD41ALqzx+kLAGyZWxEAYDSFgCMh8LRkT/4jmhO6qQ8J/rKsbPayOSMSoYrthQricBZx0eUmRFw/SEwXuhD3RcM89Lw0VdbhXE6fZ8iF74gc1SgDp9VEjlMHXFO45emzANwfIWVLiB+hG4QR6rDbh51ptI2dXKVOGHRfn/hLjTFZddDtgc6syZcXhk6XoLt/6vDag5elto6XcZxhoMjrJwcEOwA8GAdbylEAMNE/Q8ZBiVIN6GlbWPNDAXAeox/l3wWTGjUWzXVnpulWlaZn9YRE048OZFY5ZcN8X7UlR+jHcRJXJOrid1++bZ3m6K0cGlzzuVRu6uM7V8aJmeRCO1cyYR0GyH3lOIHeZTaxfN8H9eWfZ05No/HwulGr9V/N+rg98L5IAa535757NnyPx5d5XfElFxW/R+7FIwyZeyLMcqa9xjdYVP3aAgycQEA/VY4DvQqHqNlkrN/j0hvDwLw0Bi1HAbg+COSdXl43781J/0PuzSuUSoXktE2+gVwzDTGM42+EjRNDdfgdws9qvXgC8ub+5LeHDrWDqFlto6bJhdI4xKgLulPgs+uONC8Ln3yyLCHV7TgWZqhsFN7YZfJiV48+T91xlAa69C8M5KOCPg1ZwMcN3S6KD1Rt7TMfTa7aUuYzhDHroDsAXfukR5OLvXuM0Qzil4Ai6E0YZKjDsIihcXUUSCau99w66/SnKYPEUnGH4AEEt2tme+c2oGNBP8OCgK5/ORMPqhmqOSb0Mnxxv856vxpe8A2wiT9iG1rzUYYyMhROz/pDZaQrg6HiWKlmrAz4xTjV9H+Bb/Au+ehPASZOInpKS/5j/r1MvphLQb+JU9T7vINqLtYpwHk7v5ql/0eWMrhVHDW56A8Ux9lO9YNPlX5f+MW91nyC4RThAXRfZ6m+Onl1Q5LLhW3HQfqXjslXvyRp1oREKVjOkJRA5bBLBzVJyaoJIfX9SYmLu+8nM7fdfYWqjf4F \ No newline at end of file diff --git a/docs/java/basis/java-basic-questions-03.md b/docs/java/basis/java-basic-questions-03.md index 97980929..a0b01411 100644 --- a/docs/java/basis/java-basic-questions-03.md +++ b/docs/java/basis/java-basic-questions-03.md @@ -16,7 +16,7 @@ head: **Java 异常类层次结构图概览** : -![Java 异常类层次结构图](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/java/basis/types-of-exceptions-in-java.jpg) +![Java 异常类层次结构图](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/java/basis/types-of-exceptions-in-java.png) ### Exception 和 Error 有什么区别? diff --git a/docs/java/collection/concurrent-hash-map-source-code.md b/docs/java/collection/concurrent-hash-map-source-code.md index 4ac07bbd..9ddcc562 100644 --- a/docs/java/collection/concurrent-hash-map-source-code.md +++ b/docs/java/collection/concurrent-hash-map-source-code.md @@ -14,15 +14,13 @@ tag: ### 1. 存储结构 -> 下图存在两个笔误 : Segmeng -> Segment ; HashEntity -> HashEntry +![Java 7 ConcurrentHashMap 存储结构](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/java/collection/java7_concurrenthashmap.png) -![Java 7 ConcurrentHashMap 存储结构](./images/java7_concurrenthashmap.png) - -Java 7 中 `ConcurrentHashMap` 的存储结构如上图,`ConcurrnetHashMap` 由很多个 `Segment` 组合,而每一个 `Segment` 是一个类似于 HashMap 的结构,所以每一个 `HashMap` 的内部可以进行扩容。但是 `Segment` 的个数一旦**初始化就不能改变**,默认 `Segment` 的个数是 16 个,你也可以认为 `ConcurrentHashMap` 默认支持最多 16 个线程并发。 +Java 7 中 `ConcurrentHashMap` 的存储结构如上图,`ConcurrnetHashMap` 由很多个 `Segment` 组合,而每一个 `Segment` 是一个类似于 `HashMap` 的结构,所以每一个 `HashMap` 的内部可以进行扩容。但是 `Segment` 的个数一旦**初始化就不能改变**,默认 `Segment` 的个数是 16 个,你也可以认为 `ConcurrentHashMap` 默认支持最多 16 个线程并发。 ### 2. 初始化 -通过 ConcurrentHashMap 的无参构造探寻 ConcurrentHashMap 的初始化流程。 +通过 `ConcurrentHashMap` 的无参构造探寻 `ConcurrentHashMap` 的初始化流程。 ```java /** @@ -101,11 +99,11 @@ public ConcurrentHashMap(int initialCapacity,float loadFactor, int concurrencyLe 总结一下在 Java 7 中 ConcurrnetHashMap 的初始化逻辑。 1. 必要参数校验。 -2. 校验并发级别 concurrencyLevel 大小,如果大于最大值,重置为最大值。无参构造**默认值是 16.** -3. 寻找并发级别 concurrencyLevel 之上最近的 **2 的幂次方**值,作为初始化容量大小,**默认是 16**。 -4. 记录 segmentShift 偏移量,这个值为【容量 = 2 的N次方】中的 N,在后面 Put 时计算位置时会用到。**默认是 32 - sshift = 28**. -5. 记录 segmentMask,默认是 ssize - 1 = 16 -1 = 15. -6. **初始化 segments[0]**,**默认大小为 2**,**负载因子 0.75**,**扩容阀值是 2*0.75=1.5**,插入第二个值时才会进行扩容。 +2. 校验并发级别 `concurrencyLevel` 大小,如果大于最大值,重置为最大值。无参构造**默认值是 16.** +3. 寻找并发级别 `concurrencyLevel` 之上最近的 **2 的幂次方**值,作为初始化容量大小,**默认是 16**。 +4. 记录 `segmentShift` 偏移量,这个值为【容量 = 2 的N次方】中的 N,在后面 Put 时计算位置时会用到。**默认是 32 - sshift = 28**. +5. 记录 `segmentMask`,默认是 ssize - 1 = 16 -1 = 15. +6. **初始化 `segments[0]`**,**默认大小为 2**,**负载因子 0.75**,**扩容阀值是 2*0.75=1.5**,插入第二个值时才会进行扩容。 ### 3. put @@ -179,23 +177,23 @@ private Segment ensureSegment(int k) { } ``` -上面的源码分析了 ConcurrentHashMap 在 put 一个数据时的处理流程,下面梳理下具体流程。 +上面的源码分析了 `ConcurrentHashMap` 在 put 一个数据时的处理流程,下面梳理下具体流程。 -1. 计算要 put 的 key 的位置,获取指定位置的 Segment。 +1. 计算要 put 的 key 的位置,获取指定位置的 `Segment`。 -2. 如果指定位置的 Segment 为空,则初始化这个 Segment. +2. 如果指定位置的 `Segment` 为空,则初始化这个 `Segment`. **初始化 Segment 流程:** - 1. 检查计算得到的位置的 Segment 是否为null. - 2. 为 null 继续初始化,使用 Segment[0] 的容量和负载因子创建一个 HashEntry 数组。 - 3. 再次检查计算得到的指定位置的 Segment 是否为null. - 4. 使用创建的 HashEntry 数组初始化这个 Segment. - 5. 自旋判断计算得到的指定位置的 Segment 是否为null,使用 CAS 在这个位置赋值为 Segment. + 1. 检查计算得到的位置的 `Segment` 是否为null. + 2. 为 null 继续初始化,使用 `Segment[0]` 的容量和负载因子创建一个 `HashEntry` 数组。 + 3. 再次检查计算得到的指定位置的 `Segment` 是否为null. + 4. 使用创建的 `HashEntry` 数组初始化这个 Segment. + 5. 自旋判断计算得到的指定位置的 `Segment` 是否为null,使用 CAS 在这个位置赋值为 `Segment`. -3. Segment.put 插入 key,value 值。 +3. `Segment.put` 插入 key,value 值。 -上面探究了获取 Segment 段和初始化 Segment 段的操作。最后一行的 Segment 的 put 方法还没有查看,继续分析。 +上面探究了获取 `Segment` 段和初始化 `Segment` 段的操作。最后一行的 `Segment` 的 put 方法还没有查看,继续分析。 ```java final V put(K key, int hash, V value, boolean onlyIfAbsent) { @@ -249,29 +247,29 @@ final V put(K key, int hash, V value, boolean onlyIfAbsent) { } ``` -由于 Segment 继承了 ReentrantLock,所以 Segment 内部可以很方便的获取锁,put 流程就用到了这个功能。 +由于 `Segment` 继承了 `ReentrantLock`,所以 `Segment` 内部可以很方便的获取锁,put 流程就用到了这个功能。 -1. tryLock() 获取锁,获取不到使用 **`scanAndLockForPut`** 方法继续获取。 +1. `tryLock()` 获取锁,获取不到使用 **`scanAndLockForPut`** 方法继续获取。 -2. 计算 put 的数据要放入的 index 位置,然后获取这个位置上的 HashEntry 。 +2. 计算 put 的数据要放入的 index 位置,然后获取这个位置上的 `HashEntry` 。 -3. 遍历 put 新元素,为什么要遍历?因为这里获取的 HashEntry 可能是一个空元素,也可能是链表已存在,所以要区别对待。 +3. 遍历 put 新元素,为什么要遍历?因为这里获取的 `HashEntry` 可能是一个空元素,也可能是链表已存在,所以要区别对待。 - 如果这个位置上的 **HashEntry 不存在**: + 如果这个位置上的 **`HashEntry` 不存在**: 1. 如果当前容量大于扩容阀值,小于最大容量,**进行扩容**。 2. 直接头插法插入。 - 如果这个位置上的 **HashEntry 存在**: + 如果这个位置上的 **`HashEntry` 存在**: - 1. 判断链表当前元素 Key 和 hash 值是否和要 put 的 key 和 hash 值一致。一致则替换值 + 1. 判断链表当前元素 key 和 hash 值是否和要 put 的 key 和 hash 值一致。一致则替换值 2. 不一致,获取链表下一个节点,直到发现相同进行值替换,或者链表表里完毕没有相同的。 1. 如果当前容量大于扩容阀值,小于最大容量,**进行扩容**。 2. 直接链表头插法插入。 4. 如果要插入的位置之前已经存在,替换后返回旧值,否则返回 null. -这里面的第一步中的 scanAndLockForPut 操作这里没有介绍,这个方法做的操作就是不断的自旋 `tryLock()` 获取锁。当自旋次数大于指定次数时,使用 `lock()` 阻塞获取锁。在自旋时顺表获取下 hash 位置的 HashEntry。 +这里面的第一步中的 `scanAndLockForPut` 操作这里没有介绍,这个方法做的操作就是不断的自旋 `tryLock()` 获取锁。当自旋次数大于指定次数时,使用 `lock()` 阻塞获取锁。在自旋时顺表获取下 hash 位置的 `HashEntry`。 ```java private HashEntry scanAndLockForPut(K key, int hash, V value) { @@ -311,7 +309,7 @@ private HashEntry scanAndLockForPut(K key, int hash, V value) { ### 4. 扩容 rehash -ConcurrentHashMap 的扩容只会扩容到原来的两倍。老数组里的数据移动到新的数组时,位置要么不变,要么变为 index+ oldSize,参数里的 node 会在扩容之后使用链表**头插法**插入到指定位置。 +`ConcurrentHashMap` 的扩容只会扩容到原来的两倍。老数组里的数据移动到新的数组时,位置要么不变,要么变为 `index+ oldSize`,参数里的 node 会在扩容之后使用链表**头插法**插入到指定位置。 ```java private void rehash(HashEntry node) { @@ -406,7 +404,7 @@ public V get(Object key) { ### 1. 存储结构 -![Java8 ConcurrentHashMap 存储结构(图片来自 javadoop)](./images/java8_concurrenthashmap.png) +![Java8 ConcurrentHashMap 存储结构(图片来自 javadoop)](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/java/collection/java8_concurrenthashmap.png) 可以发现 Java8 的 ConcurrentHashMap 相对于 Java7 来说变化比较大,不再是之前的 **Segment 数组 + HashEntry 数组 + 链表**,而是 **Node 数组 + 链表 / 红黑树**。当冲突链表达到一定长度时,链表会转换成红黑树。 @@ -442,7 +440,7 @@ private final Node[] initTable() { } ``` -从源码中可以发现 ConcurrentHashMap 的初始化是通过**自旋和 CAS** 操作完成的。里面需要注意的是变量 `sizeCtl` ,它的值决定着当前的初始化状态。 +从源码中可以发现 `ConcurrentHashMap` 的初始化是通过**自旋和 CAS** 操作完成的。里面需要注意的是变量 `sizeCtl` ,它的值决定着当前的初始化状态。 1. -1 说明正在初始化 2. -N 说明有N-1个线程正在进行扩容 @@ -541,7 +539,7 @@ final V putVal(K key, V value, boolean onlyIfAbsent) { 5. 如果都不满足,则利用 synchronized 锁写入数据。 -6. 如果数量大于 `TREEIFY_THRESHOLD` 则要执行树化方法,在treeifyBin中会首先判断当前数组长度≥64时才会将链表转换为红黑树。 +6. 如果数量大于 `TREEIFY_THRESHOLD` 则要执行树化方法,在 `treeifyBin` 中会首先判断当前数组长度≥64时才会将链表转换为红黑树。 ### 4. get @@ -583,12 +581,12 @@ public V get(Object key) { 总结: -总的来说 ConcurrentHashMap 在 Java8 中相对于 Java7 来说变化还是挺大的, +总的来说 `ConcurrentHashMap` 在 Java8 中相对于 Java7 来说变化还是挺大的, ## 3. 总结 -Java7 中 ConcurrentHashMap 使用的分段锁,也就是每一个 Segment 上同时只有一个线程可以操作,每一个 Segment 都是一个类似 HashMap 数组的结构,它可以扩容,它的冲突会转化为链表。但是 Segment 的个数一但初始化就不能改变。 +Java7 中 `ConcurrentHashMap` 使用的分段锁,也就是每一个 Segment 上同时只有一个线程可以操作,每一个 `Segment` 都是一个类似 `HashMap` 数组的结构,它可以扩容,它的冲突会转化为链表。但是 `Segment` 的个数一但初始化就不能改变。 -Java8 中的 ConcurrentHashMap 使用的 Synchronized 锁加 CAS 的机制。结构也由 Java7 中的 **Segment 数组 + HashEntry 数组 + 链表** 进化成了 **Node 数组 + 链表 / 红黑树**,Node 是类似于一个 HashEntry 的结构。它的冲突再达到一定大小时会转化成红黑树,在冲突小于一定数量时又退回链表。 +Java8 中的 `ConcurrentHashMap` 使用的 `Synchronized` 锁加 CAS 的机制。结构也由 Java7 中的 **`Segment` 数组 + `HashEntry` 数组 + 链表** 进化成了 **Node 数组 + 链表 / 红黑树**,Node 是类似于一个 HashEntry 的结构。它的冲突再达到一定大小时会转化成红黑树,在冲突小于一定数量时又退回链表。 -有些同学可能对 Synchronized 的性能存在疑问,其实 Synchronized 锁自从引入锁升级策略后,性能不再是问题,有兴趣的同学可以自己了解下 Synchronized 的**锁升级**。 +有些同学可能对 `Synchronized` 的性能存在疑问,其实 `Synchronized` 锁自从引入锁升级策略后,性能不再是问题,有兴趣的同学可以自己了解下 `Synchronized` 的**锁升级**。 diff --git a/docs/java/collection/images/java-collection-hierarchy.png b/docs/java/collection/images/java-collection-hierarchy.png deleted file mode 100755 index 346b0203e8838c3140232acc8abead55be71c808..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24299 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%0Dh2d3{Z}Lk`q!%Y>cMk;!A$u&#N{NE{GoL!E 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 \ No newline at end of file diff --git a/docs/java/collection/images/java7_concurrenthashmap.png b/docs/java/collection/images/java7_concurrenthashmap.png deleted file mode 100755 index e8f6a24044c60ec3d211c51a41b865eafefa1710..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40808 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 E2i(atAOHXW diff --git a/docs/java/collection/images/java8_concurrenthashmap.drawio b/docs/java/collection/images/java8_concurrenthashmap.drawio new file mode 100644 index 00000000..ffc4ddfe --- /dev/null +++ b/docs/java/collection/images/java8_concurrenthashmap.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/docs/java/collection/images/java8_concurrenthashmap.png b/docs/java/collection/images/java8_concurrenthashmap.png deleted file mode 100755 index 604c4931f52f8e09996aadc4718afe4b0f8a210e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10941 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 \ No newline at end of file diff --git a/docs/java/collection/images/jdk1.7_hashmap.png b/docs/java/collection/images/jdk1.7_hashmap.png deleted file mode 100755 index df7fe6780df6e784212879814e431f0696aaef5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17009 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 \ No newline at end of file diff --git a/docs/java/collection/images/jdk1.8_hashmap.png b/docs/java/collection/images/jdk1.8_hashmap.png deleted file mode 100755 index 1228048a96ef72b7c8e5d5d528341507d770c0fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20258 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

`*ti&H+c3s{!df0ON7H5dO2)i0XzCZ+Y0sJ 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 diff --git a/docs/java/collection/java-collection-questions-01.md b/docs/java/collection/java-collection-questions-01.md index c86712bc..e52efa3a 100644 --- a/docs/java/collection/java-collection-questions-01.md +++ b/docs/java/collection/java-collection-questions-01.md @@ -20,7 +20,7 @@ Java 集合, 也叫作容器,主要是由两大接口派生而来:一个 Java 集合框架如下图所示: -![](./images/java-collection-hierarchy.png) +![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/java/collection/java-collection-hierarchy.png) 注:图中只列举了主要的继承派生关系,并没有列举所有关系。比方省略了`AbstractList`, `NavigableSet`等抽象类以及其他的一些辅助类,如想深入了解,可自行查看源码。 @@ -85,13 +85,13 @@ Java 集合框架如下图所示: ### ArrayList 与 LinkedList 区别? -1. **是否保证线程安全:** `ArrayList` 和 `LinkedList` 都是不同步的,也就是不保证线程安全; -2. **底层数据结构:** `ArrayList` 底层使用的是 **`Object` 数组**;`LinkedList` 底层使用的是 **双向链表** 数据结构(JDK1.6 之前为循环链表,JDK1.7 取消了循环。注意双向链表和双向循环链表的区别,下面有介绍到!) -3. **插入和删除是否受元素位置的影响:** +- **是否保证线程安全:** `ArrayList` 和 `LinkedList` 都是不同步的,也就是不保证线程安全; +- **底层数据结构:** `ArrayList` 底层使用的是 **`Object` 数组**;`LinkedList` 底层使用的是 **双向链表** 数据结构(JDK1.6 之前为循环链表,JDK1.7 取消了循环。注意双向链表和双向循环链表的区别,下面有介绍到!) +- **插入和删除是否受元素位置的影响:** - `ArrayList` 采用数组存储,所以插入和删除元素的时间复杂度受元素位置的影响。 比如:执行`add(E e)`方法的时候, `ArrayList` 会默认在将指定的元素追加到此列表的末尾,这种情况时间复杂度就是 O(1)。但是如果要在指定位置 i 插入和删除元素的话(`add(int index, E element)`)时间复杂度就为 O(n-i)。因为在进行上述操作的时候集合中第 i 和第 i 个元素之后的(n-i)个元素都要执行向后位/向前移一位的操作。 - `LinkedList` 采用链表存储,所以,如果是在头尾插入或者删除元素不受元素位置的影响(`add(E e)`、`addFirst(E e)`、`addLast(E e)`、`removeFirst()` 、 `removeLast()`),时间复杂度为 O(1),如果是要在指定位置 `i` 插入和删除元素的话(`add(int index, E element)`,`remove(Object o)`), 时间复杂度为 O(n) ,因为需要先移动到指定位置再插入。 -4. **是否支持快速随机访问:** `LinkedList` 不支持高效的随机元素访问,而 `ArrayList` 支持。快速随机访问就是通过元素的序号快速获取元素对象(对应于`get(int index)`方法)。 -5. **内存空间占用:** `ArrayList` 的空 间浪费主要体现在在 list 列表的结尾会预留一定的容量空间,而 LinkedList 的空间花费则体现在它的每一个元素都需要消耗比 ArrayList 更多的空间(因为要存放直接后继和直接前驱以及数据)。 +- **是否支持快速随机访问:** `LinkedList` 不支持高效的随机元素访问,而 `ArrayList` 支持。快速随机访问就是通过元素的序号快速获取元素对象(对应于`get(int index)`方法)。 +- **内存空间占用:** `ArrayList` 的空 间浪费主要体现在在 list 列表的结尾会预留一定的容量空间,而 LinkedList 的空间花费则体现在它的每一个元素都需要消耗比 ArrayList 更多的空间(因为要存放直接后继和直接前驱以及数据)。 我们在项目中一般是不会使用到 `LinkedList` 的,需要用到 `LinkedList` 的场景几乎都可以使用 `ArrayList` 来代替,并且,性能通常会更好!就连 `LinkedList` 的作者约书亚 · 布洛克(Josh Bloch)自己都说从来不会使用 `LinkedList` 。 @@ -103,8 +103,6 @@ Java 集合框架如下图所示: **双向链表:** 包含两个指针,一个 prev 指向前一个节点,一个 next 指向后一个节点。 -> 另外推荐一篇把双向链表讲清楚的文章:[https://juejin.cn/post/6844903648154271757](https://juejin.cn/post/6844903648154271757) - ![双向链表](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/双向链表.png) **双向循环链表:** 最后一个节点的 next 指向 head,而 head 的 prev 指向最后一个节点,构成一个环。 @@ -271,9 +269,8 @@ Output: ### 无序性和不可重复性的含义是什么 -1、什么是无序性?无序性不等于随机性 ,无序性是指存储的数据在底层数组中并非按照数组索引的顺序添加 ,而是根据数据的哈希值决定的。 - -2、什么是不可重复性?不可重复性是指添加的元素按照 equals()判断时 ,返回 false,需要同时重写 equals()方法和 HashCode()方法。 +- 无序性不等于随机性 ,无序性是指存储的数据在底层数组中并非按照数组索引的顺序添加 ,而是根据数据的哈希值决定的。 +- 不可重复性是指添加的元素按照 `equals()` 判断时 ,返回 false,需要同时重写 `equals()` 方法和 `hashCode()` 方法。 ### 比较 HashSet、LinkedHashSet 和 TreeSet 三者的异同 diff --git a/docs/java/collection/java-collection-questions-02.md b/docs/java/collection/java-collection-questions-02.md index e9c30f67..fd0ca6f7 100644 --- a/docs/java/collection/java-collection-questions-02.md +++ b/docs/java/collection/java-collection-questions-02.md @@ -16,11 +16,11 @@ head: ### HashMap 和 Hashtable 的区别 -1. **线程是否安全:** `HashMap` 是非线程安全的,`Hashtable` 是线程安全的,因为 `Hashtable` 内部的方法基本都经过`synchronized` 修饰。(如果你要保证线程安全的话就使用 `ConcurrentHashMap` 吧!); -2. **效率:** 因为线程安全的问题,`HashMap` 要比 `Hashtable` 效率高一点。另外,`Hashtable` 基本被淘汰,不要在代码中使用它; -3. **对 Null key 和 Null value 的支持:** `HashMap` 可以存储 null 的 key 和 value,但 null 作为键只能有一个,null 作为值可以有多个;Hashtable 不允许有 null 键和 null 值,否则会抛出 `NullPointerException`。 -4. **初始容量大小和每次扩充容量大小的不同 :** ① 创建时如果不指定容量初始值,`Hashtable` 默认的初始大小为 11,之后每次扩充,容量变为原来的 2n+1。`HashMap` 默认的初始化大小为 16。之后每次扩充,容量变为原来的 2 倍。② 创建时如果给定了容量初始值,那么 `Hashtable` 会直接使用你给定的大小,而 `HashMap` 会将其扩充为 2 的幂次方大小(`HashMap` 中的`tableSizeFor()`方法保证,下面给出了源代码)。也就是说 `HashMap` 总是使用 2 的幂作为哈希表的大小,后面会介绍到为什么是 2 的幂次方。 -5. **底层数据结构:** JDK1.8 以后的 `HashMap` 在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)时,将链表转化为红黑树(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树),以减少搜索时间(后文中我会结合源码对这一过程进行分析)。`Hashtable` 没有这样的机制。 +- **线程是否安全:** `HashMap` 是非线程安全的,`Hashtable` 是线程安全的,因为 `Hashtable` 内部的方法基本都经过`synchronized` 修饰。(如果你要保证线程安全的话就使用 `ConcurrentHashMap` 吧!); +- **效率:** 因为线程安全的问题,`HashMap` 要比 `Hashtable` 效率高一点。另外,`Hashtable` 基本被淘汰,不要在代码中使用它; +- **对 Null key 和 Null value 的支持:** `HashMap` 可以存储 null 的 key 和 value,但 null 作为键只能有一个,null 作为值可以有多个;Hashtable 不允许有 null 键和 null 值,否则会抛出 `NullPointerException`。 +- **初始容量大小和每次扩充容量大小的不同 :** ① 创建时如果不指定容量初始值,`Hashtable` 默认的初始大小为 11,之后每次扩充,容量变为原来的 2n+1。`HashMap` 默认的初始化大小为 16。之后每次扩充,容量变为原来的 2 倍。② 创建时如果给定了容量初始值,那么 `Hashtable` 会直接使用你给定的大小,而 `HashMap` 会将其扩充为 2 的幂次方大小(`HashMap` 中的`tableSizeFor()`方法保证,下面给出了源代码)。也就是说 `HashMap` 总是使用 2 的幂作为哈希表的大小,后面会介绍到为什么是 2 的幂次方。 +- **底层数据结构:** JDK1.8 以后的 `HashMap` 在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)时,将链表转化为红黑树(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树),以减少搜索时间(后文中我会结合源码对这一过程进行分析)。`Hashtable` 没有这样的机制。 **`HashMap` 中带有初始容量的构造函数:** @@ -74,7 +74,7 @@ head: `TreeMap` 和`HashMap` 都继承自`AbstractMap` ,但是需要注意的是`TreeMap`它还实现了`NavigableMap`接口和`SortedMap` 接口。 -![](./images/treemap_hierarchy.png) +![TreeMap 继承关系图](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/java/collection/treemap_hierarchy.png) 实现 `NavigableMap` 接口让 `TreeMap` 有了对集合内元素的搜索的能力。 @@ -138,22 +138,24 @@ TreeMap treeMap = new TreeMap<>((person1, person2) -> { **综上,相比于`HashMap`来说 `TreeMap` 主要多了对集合中的元素根据键排序的能力以及对集合内元素的搜索的能力。** -### HashSet 如何检查重复 +### HashSet 如何检查重复? 以下内容摘自我的 Java 启蒙书《Head first java》第二版: -当你把对象加入`HashSet`时,`HashSet` 会先计算对象的`hashcode`值来判断对象加入的位置,同时也会与其他加入的对象的 `hashcode` 值作比较,如果没有相符的 `hashcode`,`HashSet` 会假设对象没有重复出现。但是如果发现有相同 `hashcode` 值的对象,这时会调用`equals()`方法来检查 `hashcode` 相等的对象是否真的相同。如果两者相同,`HashSet` 就不会让加入操作成功。 +> 当你把对象加入`HashSet`时,`HashSet` 会先计算对象的`hashcode`值来判断对象加入的位置,同时也会与其他加入的对象的 `hashcode` 值作比较,如果没有相符的 `hashcode`,`HashSet` 会假设对象没有重复出现。但是如果发现有相同 `hashcode` 值的对象,这时会调用`equals()`方法来检查 `hashcode` 相等的对象是否真的相同。如果两者相同,`HashSet` 就不会让加入操作成功。 + +在 JDK1.8 中,`HashSet`的`add()`方法只是简单的调用了`HashMap`的`put()`方法,并且判断了一下返回值以确保是否有重复元素。直接看一下`HashSet`中的源码: -在openjdk8中,`HashSet`的`add()`方法只是简单的调用了`HashMap`的`put()`方法,并且判断了一下返回值以确保是否有重复元素。直接看一下`HashSet`中的源码: ```java // Returns: true if this set did not already contain the specified element -// 返回值:当set中没有包含add的元素时返回真 +// 返回值:当 set 中没有包含 add 的元素时返回真 public boolean add(E e) { return map.put(e, PRESENT)==null; } ``` -而在`HashMap`的`putVal()`方法中也能看到如下说明: +而在`HashMap`的`putVal()`方法中也能看到如下说明: + ```java // Returns : previous value, or null if none // 返回值:如果插入位置没有元素返回null,否则返回上一个元素 @@ -163,29 +165,13 @@ final V putVal(int hash, K key, V value, boolean onlyIfAbsent, } ``` -也就是说,在openjdk8中,实际上无论`HashSet`中是否已经存在了某元素,`HashSet`都会直接插入,只是会在`add()`方法的返回值处告诉我们插入前是否存在相同元素。 - -**`hashCode()`与 `equals()` 的相关规定:** - -1. 如果两个对象相等,则 `hashcode` 一定也是相同的 -2. 两个对象相等,对两个 `equals()` 方法返回 true -3. 两个对象有相同的 `hashcode` 值,它们也不一定是相等的 -4. 综上,`equals()` 方法被覆盖过,则 `hashCode()` 方法也必须被覆盖 -5. `hashCode()`的默认行为是对堆上的对象产生独特值。如果没有重写 `hashCode()`,则该 class 的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)。 - -**==与 equals 的区别** - -对于基本类型来说,== 比较的是值是否相等; - -对于引用类型来说,== 比较的是两个引用是否指向同一个对象地址(两者在内存中存放的地址(堆内存地址)是否指向同一个地方); - -对于引用类型(包括包装类型)来说,equals 如果没有被重写,对比它们的地址是否相等;如果 equals()方法被重写(例如 String),则比较的是地址里的内容。 +也就是说,在 JDK1.8 中,实际上无论`HashSet`中是否已经存在了某元素,`HashSet`都会直接插入,只是会在`add()`方法的返回值处告诉我们插入前是否存在相同元素。 ### HashMap 的底层实现 #### JDK1.8 之前 -JDK1.8 之前 `HashMap` 底层是 **数组和链表** 结合在一起使用也就是 **链表散列**。HashMap 通过 key 的 `hashCode` 经过扰动函数处理过后得到 hash 值,然后通过 `(n - 1) & hash` 判断当前元素存放的位置(这里的 n 指的是数组的长度),如果当前位置存在元素的话,就判断该元素与要存入的元素的 hash 值以及 key 是否相同,如果相同的话,直接覆盖,不相同就通过拉链法解决冲突。 +JDK1.8 之前 `HashMap` 底层是 **数组和链表** 结合在一起使用也就是 **链表散列**。HashMap 通过 key 的 `hashcode` 经过扰动函数处理过后得到 hash 值,然后通过 `(n - 1) & hash` 判断当前元素存放的位置(这里的 n 指的是数组的长度),如果当前位置存在元素的话,就判断该元素与要存入的元素的 hash 值以及 key 是否相同,如果相同的话,直接覆盖,不相同就通过拉链法解决冲突。 所谓扰动函数指的就是 HashMap 的 `hash` 方法。使用 `hash` 方法也就是扰动函数是为了防止一些实现比较差的 `hashCode()` 方法 换句话说使用扰动函数之后可以减少碰撞。 @@ -220,13 +206,13 @@ static int hash(int h) { 所谓 **“拉链法”** 就是:将链表和数组相结合。也就是说创建一个链表数组,数组中每一格就是一个链表。若遇到哈希冲突,则将冲突的值加到链表中即可。 -![jdk1.8 之前的内部结构-HashMap](./images/jdk1.7_hashmap.png) +![jdk1.8 之前的内部结构-HashMap](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/java/collection/jdk1.7_hashmap.png) #### JDK1.8 之后 相比于之前的版本, JDK1.8 之后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,以减少搜索时间。 -![jdk1.8之后的内部结构-HashMap](./images/jdk1.8_hashmap.png) +![jdk1.8之后的内部结构-HashMap](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/java/collection/jdk1.8_hashmap.png) > TreeMap、TreeSet 以及 JDK1.8 之后的 HashMap 底层都用到了红黑树。红黑树就是为了解决二叉查找树的缺陷,因为二叉查找树在某些情况下会退化成一个线性结构。 @@ -309,56 +295,93 @@ final void treeifyBin(Node[] tab, int hash) { `ConcurrentHashMap` 和 `Hashtable` 的区别主要体现在实现线程安全的方式上不同。 - **底层数据结构:** JDK1.7 的 `ConcurrentHashMap` 底层采用 **分段的数组+链表** 实现,JDK1.8 采用的数据结构跟 `HashMap1.8` 的结构一样,数组+链表/红黑二叉树。`Hashtable` 和 JDK1.8 之前的 `HashMap` 的底层数据结构类似都是采用 **数组+链表** 的形式,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的; -- **实现线程安全的方式(重要):** ① **在 JDK1.7 的时候,`ConcurrentHashMap`(分段锁)** 对整个桶数组进行了分割分段(`Segment`),每一把锁只锁容器其中一部分数据,多线程访问容器里不同数据段的数据,就不会存在锁竞争,提高并发访问率。 **到了 JDK1.8 的时候已经摒弃了 `Segment` 的概念,而是直接用 `Node` 数组+链表+红黑树的数据结构来实现,并发控制使用 `synchronized` 和 CAS 来操作。(JDK1.6 以后 对 `synchronized` 锁做了很多优化)** 整个看起来就像是优化过且线程安全的 `HashMap`,虽然在 JDK1.8 中还能看到 `Segment` 的数据结构,但是已经简化了属性,只是为了兼容旧版本;② **`Hashtable`(同一把锁)** :使用 `synchronized` 来保证线程安全,效率非常低下。当一个线程访问同步方法时,其他线程也访问同步方法,可能会进入阻塞或轮询状态,如使用 put 添加元素,另一个线程不能使用 put 添加元素,也不能使用 get,竞争会越来越激烈效率越低。 +- **实现线程安全的方式(重要):** + - 在 JDK1.7 的时候,`ConcurrentHashMap` 对整个桶数组进行了分割分段(`Segment`,分段锁),每一把锁只锁容器其中一部分数据(下面有示意图),多线程访问容器里不同数据段的数据,就不会存在锁竞争,提高并发访问率。 + - 到了 JDK1.8 的时候,`ConcurrentHashMap` 已经摒弃了 `Segment` 的概念,而是直接用 `Node` 数组+链表+红黑树的数据结构来实现,并发控制使用 `synchronized` 和 CAS 来操作。(JDK1.6 以后 `synchronized` 锁做了很多优化) 整个看起来就像是优化过且线程安全的 `HashMap`,虽然在 JDK1.8 中还能看到 `Segment` 的数据结构,但是已经简化了属性,只是为了兼容旧版本; + - **`Hashtable`(同一把锁)** :使用 `synchronized` 来保证线程安全,效率非常低下。当一个线程访问同步方法时,其他线程也访问同步方法,可能会进入阻塞或轮询状态,如使用 put 添加元素,另一个线程不能使用 put 添加元素,也不能使用 get,竞争会越来越激烈效率越低。 -**两者的对比图:** +下面,我们再来看看两者底层数据结构的对比图。 -**Hashtable:** +**Hashtable** : -![Hashtable全表锁](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/HashTable全表锁.png) +![Hashtable 的内部结构](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/java/collection/jdk1.7_hashmap.png)

https://www.cnblogs.com/chengxiao/p/6842045.html>

-**JDK1.7 的 ConcurrentHashMap:** +**JDK1.7 的 ConcurrentHashMap** : -![Java 7 ConcurrentHashMap 存储结构](./images/java7_concurrenthashmap.png) +![Java7 ConcurrentHashMap 存储结构](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/java/collection/java7_concurrenthashmap.png) -**JDK1.8 的 ConcurrentHashMap:** +`ConcurrentHashMap` 是由 `Segment` 数组结构和 `HashEntry` 数组结构组成。 -![Java8 ConcurrentHashMap 存储结构(图片来自 javadoop)](./images/java8_concurrenthashmap.png) +`Segment` 数组中的每个元素包含一个 `HashEntry` 数组,每个 `HashEntry` 数组属于链表结构。 + +**JDK1.8 的 ConcurrentHashMap** : + +![Java8 ConcurrentHashMap 存储结构](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/java/collection/java8_concurrenthashmap.png) JDK1.8 的 `ConcurrentHashMap` 不再是 **Segment 数组 + HashEntry 数组 + 链表**,而是 **Node 数组 + 链表 / 红黑树**。不过,Node 只能用于链表的情况,红黑树的情况需要使用 **`TreeNode`**。当冲突链表达到一定长度时,链表会转换成红黑树。 +`TreeNode`是存储红黑树节点,被`TreeBin`包装。`TreeBin`通过`root`属性维护红黑树的根结点,因为红黑树在旋转的时候,根结点可能会被它原来的子节点替换掉,在这个时间点,如果有其他线程要写这棵红黑树就会发生线程不安全问题,所以在 `ConcurrentHashMap` 中`TreeBin`通过`waiter`属性维护当前使用这棵红黑树的线程,来防止其他线程的进入。 + +```java +static final class TreeBin extends Node { + TreeNode root; + volatile TreeNode first; + volatile Thread waiter; + volatile int lockState; + // values for lockState + static final int WRITER = 1; // set while holding write lock + static final int WAITER = 2; // set when waiting for write lock + static final int READER = 4; // increment value for setting read lock +... +} +``` + ### ConcurrentHashMap 线程安全的具体实现方式/底层具体实现 -#### JDK1.7(上面有示意图) +#### JDK1.8 之前 -首先将数据分为一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据时,其他段的数据也能被其他线程访问。 +![Java7 ConcurrentHashMap 存储结构](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/java/collection/java7_concurrenthashmap.png) + +首先将数据分为一段一段(这个“段”就是 `Segment`)的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据时,其他段的数据也能被其他线程访问。 **`ConcurrentHashMap` 是由 `Segment` 数组结构和 `HashEntry` 数组结构组成**。 -Segment 继承了 `ReentrantLock`,所以 `Segment` 是一种可重入锁,扮演锁的角色。`HashEntry` 用于存储键值对数据。 +`Segment` 继承了 `ReentrantLock`,所以 `Segment` 是一种可重入锁,扮演锁的角色。`HashEntry` 用于存储键值对数据。 ```java static class Segment extends ReentrantLock implements Serializable { } ``` -一个 `ConcurrentHashMap` 里包含一个 `Segment` 数组。`Segment` 的结构和 `HashMap` 类似,是一种数组和链表结构,一个 `Segment` 包含一个 `HashEntry` 数组,每个 `HashEntry` 是一个链表结构的元素,每个 `Segment` 守护着一个 `HashEntry` 数组里的元素,当对 `HashEntry` 数组的数据进行修改时,必须首先获得对应的 `Segment` 的锁。 +一个 `ConcurrentHashMap` 里包含一个 `Segment` 数组,`Segment` 的个数一旦**初始化就不能改变**。 `Segment` 数组的大小默认是 16,也就是说默认可以同时支持 16 个线程并发写。 -#### JDK1.8 (上面有示意图) +`Segment` 的结构和 `HashMap` 类似,是一种数组和链表结构,一个 `Segment` 包含一个 `HashEntry` 数组,每个 `HashEntry` 是一个链表结构的元素,每个 `Segment` 守护着一个 `HashEntry` 数组里的元素,当对 `HashEntry` 数组的数据进行修改时,必须首先获得对应的 `Segment` 的锁。也就是说,对同一 `Segment` 的并发写入会被阻塞,不同 `Segment` 的写入是可以并发执行的。 -`ConcurrentHashMap` 取消了 `Segment` 分段锁,采用 CAS 和 `synchronized` 来保证并发安全。数据结构跟 HashMap1.8 的结构类似,数组+链表/红黑二叉树。Java 8 在链表长度超过一定阈值(8)时将链表(寻址时间复杂度为 O(N))转换为红黑树(寻址时间复杂度为 O(log(N))) +#### JDK1.8 之后 -`synchronized` 只锁定当前链表或红黑二叉树的首节点,这样只要 hash 不冲突,就不会产生并发,效率又提升 N 倍。 +![Java8 ConcurrentHashMap 存储结构](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/java/collection/java8_concurrenthashmap.png) -## Collections 工具类 +Java 8 几乎完全重写了 `ConcurrentHashMap`,代码量从原来 Java 7 中的 1000 多行,变成了现在的 6000 多行。 -Collections 工具类常用方法: +`ConcurrentHashMap` 取消了 `Segment` 分段锁,采用 `Node + CAS + synchronized` 来保证并发安全。数据结构跟 `HashMap` 1.8 的结构类似,数组+链表/红黑二叉树。Java 8 在链表长度超过一定阈值(8)时将链表(寻址时间复杂度为 O(N))转换为红黑树(寻址时间复杂度为 O(log(N)))。 -1. 排序 -2. 查找,替换操作 -3. 同步控制(不推荐,需要线程安全的集合类型时请考虑使用 JUC 包下的并发集合) +Java 8 中,锁粒度更细,`synchronized` 只锁定当前链表或红黑二叉树的首节点,这样只要 hash 不冲突,就不会产生并发,就不会影响其他 Node 的读写,效率大幅提升。 + +### JDK 1.7 和 JDK 1.8 的 ConcurrentHashMap 实现有什么不同? + +- **线程安全实现方式** :JDK 1.7 采用 `Segment` 分段锁来保证安全, `Segment` 是继承自 `ReentrantLock`。JDK1.8 放弃了 `Segment` 分段锁的设计,采用 `Node + CAS + synchronized` 保证线程安全,锁粒度更细,`synchronized` 只锁定当前链表或红黑二叉树的首节点。 +- **Hash 碰撞解决方法** : JDK 1.7 采用拉链法,JDK1.8 采用拉链法结合红黑树(链表长度超过一定阈值时,将链表转换为红黑树)。 +- **并发度** :JDK 1.7 最大并发度是 Segment 的个数,默认是 16。JDK 1.8 最大并发度是 Node 数组的大小,并发度更大。 + +## Collections 工具类(不重要) + +**`Collections` 工具类常用方法**: + +- 排序 +- 查找,替换操作 +- 同步控制(不推荐,需要线程安全的集合类型时请考虑使用 JUC 包下的并发集合) ### 排序操作