final 的内存语义

  • 写内存语义:在构造函数内对一个 final 域的写入,与随后将对象引用赋值给引用变量,这两个操作不能重排序。
  • 读内存语义:初次读一个包含 final 域的对象的引用,与随后初次读这个 final 域,这两个操作不能重排序。

写内存语义可以确保在对象的引用为任意线程可见之前,final 域已经被初始化过了。

读内存语义可以确保如果对象的引用不为 null,则说明 final 域已经被初始化过了。

总之,final 域的内存语义提供了初始化安全保证。


【内存语义的实现原理】

  • 在 final 域的写之后,构造函数 return 之前,插入一个 StoreStore 屏障。
  • 在读 final 域之前插入一个 LoadLoad 屏障。

猜你喜欢

转载自www.cnblogs.com/xmsx/p/9752613.html