auto commit
This commit is contained in:
parent
353bbf6af0
commit
fbf0eba5fd
|
@ -63,8 +63,8 @@ boolean 只有两个值:true、false,可以使用 1 bit 来存储,但是
|
||||||
基本类型都有对应的包装类型,基本类型与其对应的包装类型之间的赋值使用自动装箱与拆箱完成。
|
基本类型都有对应的包装类型,基本类型与其对应的包装类型之间的赋值使用自动装箱与拆箱完成。
|
||||||
|
|
||||||
```java
|
```java
|
||||||
Integer x = 2; // 装箱
|
Integer x = 2; // 装箱 调用了 Integer.valueOf(2)
|
||||||
int y = x; // 拆箱
|
int y = x; // 拆箱 调用了 Integer.intValue(x)
|
||||||
```
|
```
|
||||||
|
|
||||||
## 缓存池
|
## 缓存池
|
||||||
|
@ -154,7 +154,7 @@ System.out.println(m == n); // true
|
||||||
|
|
||||||
## 概览
|
## 概览
|
||||||
|
|
||||||
String 被声明为 final,因此它不可被继承。
|
String 被声明为 final,因此它不可被继承。(Integer 等包装类也不能被继承)
|
||||||
|
|
||||||
在 Java 8 中,String 内部使用 char 数组存储数据。
|
在 Java 8 中,String 内部使用 char 数组存储数据。
|
||||||
|
|
||||||
|
|
|
@ -1329,10 +1329,10 @@ synchronized 和 ReentrantLock。
|
||||||
|
|
||||||
互斥同步属于一种悲观的并发策略,总是认为只要不去做正确的同步措施,那就肯定会出现问题。无论共享数据是否真的会出现竞争,它都要进行加锁(这里讨论的是概念模型,实际上虚拟机会优化掉很大一部分不必要的加锁)、用户态核心态转换、维护锁计数器和检查是否有被阻塞的线程需要唤醒等操作。
|
互斥同步属于一种悲观的并发策略,总是认为只要不去做正确的同步措施,那就肯定会出现问题。无论共享数据是否真的会出现竞争,它都要进行加锁(这里讨论的是概念模型,实际上虚拟机会优化掉很大一部分不必要的加锁)、用户态核心态转换、维护锁计数器和检查是否有被阻塞的线程需要唤醒等操作。
|
||||||
|
|
||||||
### 1. CAS
|
|
||||||
|
|
||||||
随着硬件指令集的发展,我们可以使用基于冲突检测的乐观并发策略:先进行操作,如果没有其它线程争用共享数据,那操作就成功了,否则采取补偿措施(不断地重试,直到成功为止)。这种乐观的并发策略的许多实现都不需要将线程阻塞,因此这种同步操作称为非阻塞同步。
|
随着硬件指令集的发展,我们可以使用基于冲突检测的乐观并发策略:先进行操作,如果没有其它线程争用共享数据,那操作就成功了,否则采取补偿措施(不断地重试,直到成功为止)。这种乐观的并发策略的许多实现都不需要将线程阻塞,因此这种同步操作称为非阻塞同步。
|
||||||
|
|
||||||
|
### 1. CAS
|
||||||
|
|
||||||
乐观锁需要操作和冲突检测这两个步骤具备原子性,这里就不能再使用互斥同步来保证了,只能靠硬件来完成。硬件支持的原子性操作最典型的是:比较并交换(Compare-and-Swap,CAS)。CAS 指令需要有 3 个操作数,分别是内存地址 V、旧的预期值 A 和新值 B。当执行操作时,只有当 V 的值等于 A,才将 V 的值更新为 B。
|
乐观锁需要操作和冲突检测这两个步骤具备原子性,这里就不能再使用互斥同步来保证了,只能靠硬件来完成。硬件支持的原子性操作最典型的是:比较并交换(Compare-and-Swap,CAS)。CAS 指令需要有 3 个操作数,分别是内存地址 V、旧的预期值 A 和新值 B。当执行操作时,只有当 V 的值等于 A,才将 V 的值更新为 B。
|
||||||
|
|
||||||
### 2. AtomicInteger
|
### 2. AtomicInteger
|
||||||
|
|
|
@ -63,8 +63,8 @@ boolean 只有两个值:true、false,可以使用 1 bit 来存储,但是
|
||||||
基本类型都有对应的包装类型,基本类型与其对应的包装类型之间的赋值使用自动装箱与拆箱完成。
|
基本类型都有对应的包装类型,基本类型与其对应的包装类型之间的赋值使用自动装箱与拆箱完成。
|
||||||
|
|
||||||
```java
|
```java
|
||||||
Integer x = 2; // 装箱
|
Integer x = 2; // 装箱 调用了 Integer.valueOf(2)
|
||||||
int y = x; // 拆箱
|
int y = x; // 拆箱 调用了 Integer.intValue(x)
|
||||||
```
|
```
|
||||||
|
|
||||||
## 缓存池
|
## 缓存池
|
||||||
|
@ -154,7 +154,7 @@ System.out.println(m == n); // true
|
||||||
|
|
||||||
## 概览
|
## 概览
|
||||||
|
|
||||||
String 被声明为 final,因此它不可被继承。
|
String 被声明为 final,因此它不可被继承。(Integer 等包装类也不能被继承)
|
||||||
|
|
||||||
在 Java 8 中,String 内部使用 char 数组存储数据。
|
在 Java 8 中,String 内部使用 char 数组存储数据。
|
||||||
|
|
||||||
|
|
|
@ -1329,10 +1329,10 @@ synchronized 和 ReentrantLock。
|
||||||
|
|
||||||
互斥同步属于一种悲观的并发策略,总是认为只要不去做正确的同步措施,那就肯定会出现问题。无论共享数据是否真的会出现竞争,它都要进行加锁(这里讨论的是概念模型,实际上虚拟机会优化掉很大一部分不必要的加锁)、用户态核心态转换、维护锁计数器和检查是否有被阻塞的线程需要唤醒等操作。
|
互斥同步属于一种悲观的并发策略,总是认为只要不去做正确的同步措施,那就肯定会出现问题。无论共享数据是否真的会出现竞争,它都要进行加锁(这里讨论的是概念模型,实际上虚拟机会优化掉很大一部分不必要的加锁)、用户态核心态转换、维护锁计数器和检查是否有被阻塞的线程需要唤醒等操作。
|
||||||
|
|
||||||
### 1. CAS
|
|
||||||
|
|
||||||
随着硬件指令集的发展,我们可以使用基于冲突检测的乐观并发策略:先进行操作,如果没有其它线程争用共享数据,那操作就成功了,否则采取补偿措施(不断地重试,直到成功为止)。这种乐观的并发策略的许多实现都不需要将线程阻塞,因此这种同步操作称为非阻塞同步。
|
随着硬件指令集的发展,我们可以使用基于冲突检测的乐观并发策略:先进行操作,如果没有其它线程争用共享数据,那操作就成功了,否则采取补偿措施(不断地重试,直到成功为止)。这种乐观的并发策略的许多实现都不需要将线程阻塞,因此这种同步操作称为非阻塞同步。
|
||||||
|
|
||||||
|
### 1. CAS
|
||||||
|
|
||||||
乐观锁需要操作和冲突检测这两个步骤具备原子性,这里就不能再使用互斥同步来保证了,只能靠硬件来完成。硬件支持的原子性操作最典型的是:比较并交换(Compare-and-Swap,CAS)。CAS 指令需要有 3 个操作数,分别是内存地址 V、旧的预期值 A 和新值 B。当执行操作时,只有当 V 的值等于 A,才将 V 的值更新为 B。
|
乐观锁需要操作和冲突检测这两个步骤具备原子性,这里就不能再使用互斥同步来保证了,只能靠硬件来完成。硬件支持的原子性操作最典型的是:比较并交换(Compare-and-Swap,CAS)。CAS 指令需要有 3 个操作数,分别是内存地址 V、旧的预期值 A 和新值 B。当执行操作时,只有当 V 的值等于 A,才将 V 的值更新为 B。
|
||||||
|
|
||||||
### 2. AtomicInteger
|
### 2. AtomicInteger
|
||||||
|
|
Loading…
Reference in New Issue
Block a user