1
0
mirror of https://github.com/Snailclimb/JavaGuide synced 2025-06-20 22:17:09 +08:00

Merge pull request #513 from Rustin-Liu/rustin-patch-2

#511 fix typo error
This commit is contained in:
SnailClimb 2019-10-25 23:07:23 +08:00 committed by GitHub
commit b5ce81a44a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 2 additions and 2 deletions

View File

@ -78,7 +78,7 @@ num2 = 20
![example 2](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-9-27/3825204.jpg)
array 被初始化 arr 的拷贝也就是一个对象的引用,也就是说 array 和 arr 指向的同一个数组对象。 因此,外部对引用对象的改变会反映到所对应的对象上。
array 被初始化 arr 的拷贝也就是一个对象的引用,也就是说 array 和 arr 指向的同一个数组对象。 因此,外部对引用对象的改变会反映到所对应的对象上。
**通过 example2 我们已经看到,实现一个改变对象参数状态的方法并不是一件难事。理由很简单,方法得到的是对象引用的拷贝,对象引用及其他的拷贝同时引用同一个对象。**

View File

@ -95,7 +95,7 @@ uniqueInstance 采用 volatile 关键字修饰也是很有必要的, uniqueIns
2. 初始化 uniqueInstance
3. 将 uniqueInstance 指向分配的内存地址
但是由于 JVM 具有指令重排的特性,执行顺序有可能变成 1->3->2。指令重排在单线程环境下不会出问题,但是在多线程环境下会导致一个线程获得还没有初始化的实例。例如,线程 T1 执行了 1 和 3此时 T2 调用 getUniqueInstance() 后发现 uniqueInstance 不为空,因此返回 uniqueInstance但此时 uniqueInstance 还未被初始化。
但是由于 JVM 具有指令重排的特性,执行顺序有可能变成 1->3->2。指令重排在单线程环境下不会出问题,但是在多线程环境下会导致一个线程获得还没有初始化的实例。例如,线程 T1 执行了 1 和 3此时 T2 调用 getUniqueInstance() 后发现 uniqueInstance 不为空,因此返回 uniqueInstance但此时 uniqueInstance 还未被初始化。
使用 volatile 可以禁止 JVM 的指令重排,保证在多线程环境下也能正常运行。