并发学习-final

    xiaoxiao2022-06-30  99

    对于 final 域,编译器和CPU要遵守两个重排序规则: final 写:“构造函数内对一个final域的写入”,与“随后把这个被构造对象的引用赋值给一个引用变量”,这两个操作之间不能重排序。 final 读:“初次读一个包含final域的对象的引用”,与“随后初次读对象的final域”,这两个操作之间不能重排序。写 final 域的重排序规则禁止把 final 域的写重排序到构造函数之外。这个规则的实现包含下面两个方面: 1, JMM 禁止编译器把 final 域的写重排序到构造函数之外。 2, 编译器会在 final 域的写之后,构造函数 return 之前,插入一个 StoreStore 屏障。这个屏障禁止处理器把 final 域的写重排序到构造函数之外。读 final 域的重排序规则如下: 在一个线程中,“初次读对象引用"与"初次读该对象包含的 final 域”,JMM 禁止处理器重排序这两个操作(注意,这个规则仅仅针对处理器)。 编译器会在读 final 域操作的前面插入一个 LoadLoad 屏障。 初次度该对象与读该对象的final域有关联关系,大多数处理器不会进行重新排序,少量处理器会允许对具有间接关联关系的两个操作重新排序,如alpha处理器,该规则就是针对这类处理器的

    最新回复(0)