From e878afe820ef2cf19f4cf2b6166d7df145246608 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=80=E9=9B=80=E4=B8=8A=E5=A4=B4=E7=B2=91=E9=A2=97?= =?UTF-8?q?=E9=A5=AD?= Date: Tue, 28 Jul 2020 15:03:00 +0800 Subject: [PATCH] =?UTF-8?q?Update=204=E3=80=81final=E5=85=B3=E9=94=AE?= =?UTF-8?q?=E5=AD=97=E7=89=B9=E6=80=A7.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修正final域i、j部分地方写反了 --- ...\263\351\224\256\345\255\227\347\211\271\346\200\247.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/docs/java/basic/4\343\200\201final\345\205\263\351\224\256\345\255\227\347\211\271\346\200\247.md" "b/docs/java/basic/4\343\200\201final\345\205\263\351\224\256\345\255\227\347\211\271\346\200\247.md" index f9c0f39..ff1118c 100644 --- "a/docs/java/basic/4\343\200\201final\345\205\263\351\224\256\345\255\227\347\211\271\346\200\247.md" +++ "b/docs/java/basic/4\343\200\201final\345\205\263\351\224\256\345\255\227\347\211\271\346\200\247.md" @@ -482,7 +482,7 @@ final修饰的函数会被编译器优化,优化的结果是减少了函数调 在上图中,写普通域的操作被编译器重排序到了构造函数之外,读线程 B 错误的读取了普通变量 i 初始化之前的值。而写 final 域的操作,被写 final 域的重排序规则“限定”在了构造函数之内,读线程 B 正确的读取了 final 变量初始化之后的值。 -写 final 域的重排序规则可以确保:在对象引用为任意线程可见之前,对象的 final 域已经被正确初始化过了,而普通域不具有这个保障。以上图为例,在读线程 B“看到”对象引用 obj 时,很可能 obj 对象还没有构造完成(对普通域 i 的写操作被重排序到构造函数外,此时初始值 2 还没有写入普通域 i)。 +写 final 域的重排序规则可以确保:在对象引用为任意线程可见之前,对象的 final 域已经被正确初始化过了,而普通域不具有这个保障。以上图为例,在读线程 B“看到”对象引用 obj 时,很可能 obj 对象还没有构造完成(对普通域 i 的写操作被重排序到构造函数外,此时初始值 1 还没有写入普通域 i)。 ### 读 final 域的重排序规则 @@ -495,8 +495,8 @@ final修饰的函数会被编译器优化,优化的结果是减少了函数调 reader() 方法包含三个操作: 1. 初次读引用变量 obj; -2. 初次读引用变量 obj 指向对象的普通域 j。 -3. 初次读引用变量 obj 指向对象的 final 域 i。 +2. 初次读引用变量 obj 指向对象的普通域 i。 +3. 初次读引用变量 obj 指向对象的 final 域 j。 现在我们假设写线程 A 没有发生任何重排序,同时程序在不遵守间接依赖的处理器上执行,下面是一种可能的执行时序: