一、饿汉式
- //饿汉式
- public class Singleton {
- //单例变量 ,static的,在类加载时进行初始化一次,保证线程安全
- private static Singleton instance = new Singleton();
- //私有化的构造方法,保证外部的类不能通过构造器来实例化。
- private Singleton() {}
- //获取单例对象实例
- public static Singleton getInstance() {
- System.out.println("我是饿汉式单例!");
- return instance;
- }
- }
看到上面的代码,瞬间觉得这个世界清静了。不过这种方式采用的是饿汉式的方法,就是预先声明Singleton对象,这样带来的一个缺点就是:如果构造的单例很大,构造完又迟迟不使用,会导致资源浪费。
二、懒汉式
- //内部类实现懒汉式
- public class Singleton {
- private static class SingletonHolder{
- //单例变量
- private static Singleton instance = new Singleton();
- }
- //私有化的构造方法,保证外部的类不能通过构造器来实例化。
- private Singleton() {
- }
- //获取单例对象实例
- public static Singleton getInstance() {
- System.out.println("我是内部类单例!");
- return SingletonHolder.instance;
- }
- }
懒汉式(避免上面的资源浪费)、线程安全、代码简单。因为java机制规定,内部类SingletonHolder只有在getInstance()方法第一次调用的时候才会被加载(实现了lazy),而且其加载过程是线程安全的(实现线程安全)。内部类加载的时候实例化一次instance。