Merge pull request #2 from CyC2018/master

更新
This commit is contained in:
huangxingqi 2019-08-12 13:38:16 +08:00 committed by GitHub
commit a977a16353
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 11 additions and 5 deletions

View File

@ -63,8 +63,8 @@ boolean 只有两个值true、false可以使用 1 bit 来存储,但是
基本类型都有对应的包装类型基本类型与其对应的包装类型之间的赋值使用自动装箱与拆箱完成
```java
Integer x = 2; // 装箱
int y = x; // 拆箱
Integer x = 2; // 装箱 调用了 Integer.valueOf(2);
int y = x; // 拆箱 调用了 Integer.intValue(x);
```
## 缓存池
@ -78,6 +78,11 @@ new Integer(123) 与 Integer.valueOf(123) 的区别在于:
Integer x = new Integer(123);
Integer y = new Integer(123);
System.out.println(x == y); // false
Integer x = 123; //调用了Integer.valueOf(123);
Integer y = 123; //如果数值在[-128,127]之间便返回指向缓冲池中已经存在的对象的引用否则创建一个新的Integer对象
System.out.println(x==y); //true
Integer z = Integer.valueOf(123);
Integer k = Integer.valueOf(123);
System.out.println(z == k); // true
@ -154,7 +159,7 @@ System.out.println(m == n); // true
## 概览
String 被声明为 final因此它不可被继承
String 被声明为 final因此它不可被继承(Integer等包装类也不能被继承)
Java 8 String 内部使用 char 数组存储数据

View File

@ -768,6 +768,7 @@ static final int tableSizeFor(int cap) {
### 8. 链表转红黑树
JDK 1.8 开始一个桶存储的链表长度大于 8 时会将链表转换为红黑树
应该是 JDK 1.8 开始 table的长度也就是HashMap的capacity(不是size)不能小于64而且在桶存储的链表长度为8时(准确的说是长度为7并且在继续塞第8个时),转换成红黑树,而不是超过8
### 9. HashTable 的比较

View File

@ -1329,10 +1329,10 @@ synchronized 和 ReentrantLock。
互斥同步属于一种悲观的并发策略总是认为只要不去做正确的同步措施那就肯定会出现问题无论共享数据是否真的会出现竞争它都要进行加锁这里讨论的是概念模型实际上虚拟机会优化掉很大一部分不必要的加锁用户态核心态转换维护锁计数器和检查是否有被阻塞的线程需要唤醒等操作
### 1. CAS
随着硬件指令集的发展我们可以使用基于冲突检测的乐观并发策略先进行操作如果没有其它线程争用共享数据那操作就成功了否则采取补偿措施不断地重试直到成功为止这种乐观的并发策略的许多实现都不需要将线程阻塞因此这种同步操作称为非阻塞同步
### 1. CAS
乐观锁需要操作和冲突检测这两个步骤具备原子性这里就不能再使用互斥同步来保证了只能靠硬件来完成硬件支持的原子性操作最典型的是比较并交换Compare-and-SwapCASCAS 指令需要有 3 个操作数分别是内存地址 V旧的预期值 A 和新值 B当执行操作时只有当 V 的值等于 A才将 V 的值更新为 B
### 2. AtomicInteger