对象只有在完全初始化后,其final变量对其它线程才是可见的。这说明,final变量的初始化可以在不使用synchronization的情况下实现线程安全。这样,final变量实现了真正意义上的final(即,不-可-变),而不会在初始化过程中、后在多线程中看起来会改变。
class A { final Map<String,String> map=null; public void A() { map = new HashMap<String,String>(); map.put("key1","value1"); } }
其他线程在引用A的对象之前,JMM保证A的final变量已经被其构造函数完全初始化。也就是说,final变量的完全初始化 happends-before 其他线程对该对象的引用。即,final变量在构造函数中的初始化是线程安全的。