通常认为静态初始化是线程安全的,保证只会发生一次。但我很好奇语言规范确切地在哪里声明了不会出现可见性问题?这来自于http://www.ibm.com/developerworks/library/j-jtp03304/
“这个过程保证了当一个变量在由给定监视器保护的同步块中被一个线程写入,并且在由相同监视器保护的同步块中被另一个线程读取时,变量的写入将被读取线程看到。JMM在没有同步的情况下不会做出此保证。”
我从其他几个来源也读到了类似的内容。对于静态初始化,我们不使用任何同步。假设初始化资源是有效不可变的,并且我们从不对其进行写操作,则永远不会使用同步来访问它,并且不将其设置为易失性。那么,保证任何读取线程不会看到空指针或部分初始化对象的保证来自哪里呢?显然,由于它发生在加载期间,不存在另一个线程在之前读取该值并看到旧值的可能性,但是有什么保证可以确保初始化结果不会留在执行线程的本地内存中?我很好奇静态初始化为什么是安全的。
我从其他几个来源也读到了类似的内容。对于静态初始化,我们不使用任何同步。假设初始化资源是有效不可变的,并且我们从不对其进行写操作,则永远不会使用同步来访问它,并且不将其设置为易失性。那么,保证任何读取线程不会看到空指针或部分初始化对象的保证来自哪里呢?显然,由于它发生在加载期间,不存在另一个线程在之前读取该值并看到旧值的可能性,但是有什么保证可以确保初始化结果不会留在执行线程的本地内存中?我很好奇静态初始化为什么是安全的。
编辑:我了解静态初始化是线程安全的。问题是为什么以及有什么保证。