Skip to content

Latest commit

 

History

History
155 lines (122 loc) · 3.78 KB

单例模式.md

File metadata and controls

155 lines (122 loc) · 3.78 KB

单例模式

  • 单例顾名思义,在jvm中有且只有一个对象. 确保一个类在任何情况下只有一个实例,并提供一个全局访问点.
  • 单例的两种模式
    1. 饿汉式
    2. 懒汉式

饿汉式

public class Hungry {

    /**
     * 提前创建一个实例 且不能修改
     */
    private static final Hungry HUNGRY = new Hungry();

    /**
     * 私有化构造方法
     */
    private Hungry() {
    }

    /**
     * 返回实例
     */
    public static Hungry getInstance() {
        return HUNGRY;
    }

}

懒汉式

public class Lazy1 {

    // 静态代码块
    private static Lazy1 lazy1 = null;

    private Lazy1() {
    }

    public static Lazy1 getInstance() {
        if (lazy1 == null) {
            // 先判断是否存在该实例 ,如果不存在则创建实例
            lazy1 = new Lazy1();
        }
        // 实例存在则返回该实例
        return lazy1;
    }

}

多线程环境下

饿汉式测试

    private static void hungryTest() {
        CountDownLatch latch = new CountDownLatch(count);

        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                try {
                    latch.await();
                    Hungry instance = Hungry.getInstance();
                    System.out.println(System.currentTimeMillis() + " : " + instance);
                } catch (Exception e) {

                }
            }).start();
            latch.countDown();
        }

    }
  • 执行结果
1591081577370 : com.huifer.design.singleton.Hungry@33b84c39
1591081577370 : com.huifer.design.singleton.Hungry@33b84c39
1591081577370 : com.huifer.design.singleton.Hungry@33b84c39
1591081577370 : com.huifer.design.singleton.Hungry@33b84c39
1591081577370 : com.huifer.design.singleton.Hungry@33b84c39
1591081577370 : com.huifer.design.singleton.Hungry@33b84c39
1591081577370 : com.huifer.design.singleton.Hungry@33b84c39
1591081577370 : com.huifer.design.singleton.Hungry@33b84c39
1591081577370 : com.huifer.design.singleton.Hungry@33b84c39
1591081577370 : com.huifer.design.singleton.Hungry@33b84c39
  • hashCode 相同证明多线程环境下他也是单例的

懒汉式测试

private static void lazyTest1() {
        CountDownLatch latch = new CountDownLatch(count);
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {

                try {
                    latch.await();
                    Lazy1 instance = Lazy1.getInstance();
                    System.out.println(System.currentTimeMillis() + " : " + instance);
                } catch (Exception e) {

                }
            }).start();

            latch.countDown();
        }
    }
  • 执行结果
1591081604219 : com.huifer.design.singleton.Lazy1@22ec0514
1591081604219 : com.huifer.design.singleton.Lazy1@1a77cbc0
1591081604219 : com.huifer.design.singleton.Lazy1@22ec0514
1591081604219 : com.huifer.design.singleton.Lazy1@22ec0514
1591081604219 : com.huifer.design.singleton.Lazy1@645cd96c
1591081604219 : com.huifer.design.singleton.Lazy1@22ec0514
1591081604219 : com.huifer.design.singleton.Lazy1@22ec0514
1591081604219 : com.huifer.design.singleton.Lazy1@22ec0514
1591081604219 : com.huifer.design.singleton.Lazy1@22ec0514
1591081604219 : com.huifer.design.singleton.Lazy1@22ec0514
  • hashCode 部分相同说明在多线程环境下没有单例,需要改进

最直接的改进

public class Lazy1 {

    // 静态代码块
    private static Lazy1 lazy1 = null;

    private Lazy1() {
    }

    public synchronized static Lazy1 getInstance() {
        if (lazy1 == null) {
            // 先判断是否存在该实例 ,如果不存在则创建实例
            lazy1 = new Lazy1();
        }
        // 实例存在则返回该实例
        return lazy1;
    }

}