人力资源管理系统。当我读到这篇文章时,它在技术上是不正确的,但在实践中还可以,但有一些警告。只有 final 字段可以安全地初始化一次并在多个线程中访问而无需同步。
延迟初始化的线程可能会以多种方式遭受同步问题。例如,您可以有构造函数竞争条件,其中类的引用已被导出,而类本身没有完全初始化。
我认为这在很大程度上取决于您是否拥有原始字段或对象。在您不介意多个线程进行初始化的情况下,可以多次初始化的原始字段可以正常工作。然而HashMap
,以这种方式初始化样式可能会出现问题。甚至long
某些架构上的值可能会在多个操作中存储不同的单词,因此可能会导出一半的值,尽管我怀疑 along
永远不会跨越内存页面,因此它永远不会发生。
我认为这在很大程度上取决于应用程序是否有任何内存障碍——任何synchronized
块或对volatile
字段的访问。魔鬼当然在细节中,执行延迟初始化的代码可能在具有一组代码的架构上正常工作,而不是在不同的线程模型或很少同步的应用程序中。
这是一个关于 final 字段的好文章作为比较:
http://www.javamex.com/tutorials/synchronization_final.shtml
从 Java 5 开始,final 关键字的一个特殊用途是并发武器库中非常重要且经常被忽视的武器。本质上,final 可用于确保在构造对象时,访问该对象的另一个线程不会看到该对象处于部分构造状态,否则可能会发生这种情况。这是因为当用作对象变量的属性时,final 在其定义中具有以下重要特征:
现在,即使字段被标记为final,如果是类,您可以修改类内的字段。这是一个不同的问题,您仍然必须为此进行同步。