1.static:静态初始化不需要同步,自带线程安全属性
public class LazyInitialization {
private static class ResourceHolder {
public static Resource resource = new Resource();
}
public static Resource getResource() {
return ResourceHolder.resource;
}
}
当任何一个线程第一次调用getResource时,都会使ResourceHolder被加载和被初始化,此时静态内部初始化器将执行Resource的初始化操作。
2.final:对于含有final域的对象,初始化安全性可以防止对对象的初始引用被重排序到构造过程完成之前。
public class SafeStates {
private final Map<String, String > states;
public SafeStates() {
states = new HashMap<>();
states.put("safe", "1");
states.put("states", "2");
}
public String getItem(String s) {
return states.get(s);
}
}
所有属性均为private final域,可以有效防止对象在构造过程中逸出,因为private控制了访问入口,final防止了指令重排。
本文探讨Java中static关键字的静态初始化特性,其自带线程安全属性,以及final域如何确保对象初始化的安全性,防止指令重排。通过实例解析,帮助理解线程安全的关键概念。
1064

被折叠的 条评论
为什么被折叠?



