单例设计模式实现的三种方式

1、饿汉式

  • 私有化构造方法
  • 创建一个对象,这个对象是被 private static final 修饰
  • 向外创建一个静态方法,返回这个实例。
package singleton;
/**
* 单例模式:饿汉式,最为简单的写法同时也是使用最多的
*
*/
public class Demo{
    private Demo(){}


    private static final Demo demo= new Demo();


    public static Demo getInstance(){
        return demo;
    }

}

2、懒汉式(升级版)

  • 私有化构造方法

  • 创建静态内部类

  • 编写向外提供单例的方法(方法中直接返回静态类的私有化成员对象)

package singleton;

/**
* 迄今为止最安全的懒加载
* 线程安全由jvm保证,因为jvm只对类加载一次
* 其中的静态内部类是当使用getInstance方法的时候才加载
*/
public class Lanhanshi {
    private Lanhanshi(){
        
    }
    
    private static class LanhanshiHander{
        private static final Lanhanshi lanhanshi = new Lanhanshi();
    }

    public static Lanhanshi getInstance() {
        return LanhanshiHander.lanhanshi;
    }

    public static void main(String[] args) {
        Lanhanshi instance = Lanhanshi.getInstance();
        Lanhanshi instance2 = Lanhanshi.getInstance();
        System.out.println(instance==instance2);
        new Thread(()-> {
            for (int i = 0; i < 100; i++) {
                System.out.println(Lanhanshi.getInstance());
            }
            }).start();
    }
}

3、枚举方法创建单例

package singleton;
/**
* 在effect java中,推荐使用枚举单例,不仅线程安全,还可以防止序列化
*
*/
public enum  EnumSingle {
    INSTANCE;
    public void EnumSingle(){}

    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            new Thread(()->{
                System.out.println(EnumSingle.INSTANCE.hashCode());
            }).start();
        }
    }
}

打印结果
在这里插入图片描述
提示:枚举类没有构造方法。

posted @ 2019-12-08 12:13  起个名字都这么男  阅读(80)  评论(0编辑  收藏  举报