Skip to content

Commit e878afe

Browse files
authored
Update 4、final关键字特性.md
修正final域i、j部分地方写反了
1 parent 5ec9025 commit e878afe

File tree

1 file changed

+3
-3
lines changed

1 file changed

+3
-3
lines changed

docs/java/basic/4、final关键字特性.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -482,7 +482,7 @@ final修饰的函数会被编译器优化,优化的结果是减少了函数调
482482

483483
在上图中,写普通域的操作被编译器重排序到了构造函数之外,读线程 B 错误的读取了普通变量 i 初始化之前的值。而写 final 域的操作,被写 final 域的重排序规则“限定”在了构造函数之内,读线程 B 正确的读取了 final 变量初始化之后的值。
484484

485-
写 final 域的重排序规则可以确保:在对象引用为任意线程可见之前,对象的 final 域已经被正确初始化过了,而普通域不具有这个保障。以上图为例,在读线程 B“看到”对象引用 obj 时,很可能 obj 对象还没有构造完成(对普通域 i 的写操作被重排序到构造函数外,此时初始值 2 还没有写入普通域 i)。
485+
写 final 域的重排序规则可以确保:在对象引用为任意线程可见之前,对象的 final 域已经被正确初始化过了,而普通域不具有这个保障。以上图为例,在读线程 B“看到”对象引用 obj 时,很可能 obj 对象还没有构造完成(对普通域 i 的写操作被重排序到构造函数外,此时初始值 1 还没有写入普通域 i)。
486486

487487
### 读 final 域的重排序规则
488488

@@ -495,8 +495,8 @@ final修饰的函数会被编译器优化,优化的结果是减少了函数调
495495
reader() 方法包含三个操作:
496496

497497
1. 初次读引用变量 obj;
498-
2. 初次读引用变量 obj 指向对象的普通域 j
499-
3. 初次读引用变量 obj 指向对象的 final 域 i
498+
2. 初次读引用变量 obj 指向对象的普通域 i
499+
3. 初次读引用变量 obj 指向对象的 final 域 j
500500

501501
现在我们假设写线程 A 没有发生任何重排序,同时程序在不遵守间接依赖的处理器上执行,下面是一种可能的执行时序:
502502

0 commit comments

Comments
 (0)