- 除了使用锁或volatile修饰符,还有一种情况可以安全地访问一个共享域,即这个域声明为final时。
final Map<String, Double> accounts = new HashMap<>();
- 其它线程会在构造函数完成构造之后才看到这个
accounts
变量。 - 如果不使用final,就不能保证其它线程看到的是accounts更新后的值,它们可能都只是看到null,而不是新构造的HashMap。
- 当然,这个映射表的操作并不是线程安全的。如果多个线程在读取这个映射表,仍然需要进行同步。