@@ -349,7 +349,6 @@ synchronized (obj) {
349
349
obj.wait();
350
350
}
351
351
}
352
-
353
352
```
354
353
355
354
synchronized 可以用来修饰非静态方法(普通方法)、静态方法、代码块,锁住的是 class 对象的对象头!
@@ -401,12 +400,13 @@ Java 中的线程分为两种:
401
400
402
401
计算数组下标是与操作,只有低 n 位进行与操作,高位不参与任何操作 -> 为了增大散列程度减小哈希碰撞,因此将高十六位参与进哈希值的计算。
403
402
404
- put() 的流程:
403
+ ` put() ` 的流程:
404
+
405
405
1 . hashcode的高十六位和低十六位进行异或运算
406
- 2 . (n - 1) & hash 计算数组下标,当 n 为二次幂时,等价于取余操作( (n - 1)& hash = hash % n) 。
406
+ 2 . ` (n - 1) & hash ` 计算数组下标,当 n 为二次幂时,等价于取余操作 ` (n - 1)& hash = hash % n ` 。
407
407
3 . 判断当前下标是否有元素,若有元素,使用尾插法。再根据链表长度判断是否需要转换成红黑树。
408
408
409
- 第一次扩容:执行第一次 put() 操作时,如果数组为空便会执行第一次扩容操作,初始化数组容量为默认大小。
409
+ 第一次扩容:执行第一次 ` put() ` 操作时,如果数组为空便会执行第一次扩容操作,初始化数组容量为默认大小。
410
410
411
411
412
412
扩容的过程:
@@ -436,7 +436,10 @@ NULL key AND NULL value:
436
436
437
437
ConcurrentHashMap JDK7 vs JDK8
438
438
- JDK7: 数组 + 链表。先定位 Segment,再定位桶。底层结构是继承了ReentrantLock的Segment数组。可以看成是由线程安全的HashMap组成的一个map数组,数组的长度决定了支持的最大的并发量。
439
- - JDK8: 数组 + 链表 + 红黑树。可以直接定位到桶。链表中的元素超过8并且数组长度大于64后,将链表结构转换成红黑树。通过对Node数组以CAS方式实现扩容和对Node数组的每个元素的synchronized保证ConcurrentHashMap整体的线程安全。
439
+ - JDK8: 数组 + 链表 + 红黑树。可以直接定位到桶。链表中的元素超过8并且数组长度大于64后,将链表结构转换成红黑树。
440
+ 1 . 使用 volatile 修饰Node的值和Next数组以保证值变化时对于其他线程是可见的
441
+ 2 . 使用 table 数组的头结点作为 synchronized 的锁来保证写操作的安全
442
+ 3 . 当头结点为 null 时,使用 CAS 操作来保证数据能正确的写入。
440
443
441
444
![ ] ( https://raw.githubusercontent.com/CompetitiveLin/ImageHostingService/picgo/imgs/202305151605481.png )
442
445
@@ -665,6 +668,7 @@ java中静态属性和静态方法可以被继承,但是不能被重写,因
665
668
3 . 代理模式:` java.lang.reflect ` Proxy 类使用动态代理
666
669
4 . 迭代器模式:` java.util ` Iterator 接口使用迭代器遍历集合容器
667
670
5 . 模板方法模式:` java.util.concurrent.locks ` AQS 中的 ` tryAcquire ` , ` tryRelease ` , ` tryAcquireShared ` , ` tryReleaseShared ` 方法被公平锁和非公平锁重写
668
- 6 . 装饰器模式 + 适配器模式
671
+ 6 . 建造者模式:线程不安全的 ` StringBuilder ` 和线程安全的 ` StringBuffer `
672
+ 7 . 装饰器模式 + 适配器模式
669
673
1 . 装饰器模式:通过组合替代继承的方式在不改变原始类的情况下** 添加增强功能** ,例如 ` FilterInputStream ` 和 ` FilterOutputStream ` 用于增强 ` InputStream ` 和 ` OutputStream ` 的功能。
670
674
2 . 适配器模式:字符流对象和字节流对象的** 相互适配**
0 commit comments