Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit cac85ff

Browse files
authored
Merge pull request h2pl#24 from Heemooo/patch-1
Update 4、final关键字特性.md
2 parents b16f324 + e878afe commit cac85ff

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)

AltStyle によって変換されたページ (->オリジナル) /