方案一:非延迟加载单例类
1 | public class Singleton { |
方案二:简单的同步延迟加载
1 | public class Singleton { |
方案三:双重检查成例延迟加载
1 | public class Singleton { |
为什么不将 synchronized 关键字加载静态方法上呢?原因是,如果加载方法上,每次获取都会加锁,效率降低了很多。如果加载内部为空的方法里面,则只是在初始化的时候加锁一次。在可能的情况下,一般尽量将要同步的代码最小化, 这样可以达到线程的阻塞最小化。
方法四:类加载器延迟加载
1 | public class Singleton { |
推荐方式四,利用内部类初始化时才进行单例类的初始化,实现了延迟加载,而且防止了并发,且避免使用锁的开销。