单例设计模式

单例设计模式

懒汉式

/*
 * 单例设计模式:懒汉式
 * */
public class SingleTonDemo02 {
    public static void main(String[] args) {
        Demo02 instance1 = Demo02.getInstance();
        Demo02 instance2 = Demo02.getInstance();
        System.out.println(instance1 == instance2);
    }
}

class Demo02 {
    // 1.私有化类的构造器
    private Demo02() {
    }

    // 2.在内部静态声明,没初始化
    private static Demo02 instance = null;

    // 声明一个公共静态的返回这个实例对象的方法
    public static Demo02 getInstance() {
        // 判断是否实例化过,没有就实例化
        if (instance == null) {
            // 实例赋值
            instance = new Demo02();
        }
        return instance;
    }
}

饿汉式

package com.designMode.singleTon;
/*
* 单例设计模式:饿汉式
* */
public class SingleTonDemo01 {
    public static void main(String[] args) {
        // 可以拿到
        Demo01 instance = Demo01.getInstance();
        // 无论第几次都是同一个,只有一个实例
        Demo01 instance1 = Demo01.getInstance();

        // 为true
        System.out.println(instance == instance1);
    }
}

// 饿汉式
class Demo01 {
    // 1.私有化类的构造器
    private Demo01() {
    }
    // 2.内部静态创建类的对象
    private static Demo01 instance = new Demo01();
    // 3.提供公共的静态方法
    public static Demo01 getInstance() {
        return instance;
    }
}

区别

饿汉式:

  • 坏处:开始就创建对象,生命周期过长,节约时间
  • 好处:线程安全

懒汉式:

  • 好处:延迟对象的创建,节约内存
  • 坏处:目前写法不安全

线程安全的懒汉式

原来的写法

有概率会是线程不安全,创建两个对象

public class SingleTonDemo02 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        FutureTask futureTask1 = new FutureTask(() -> Demo02.getInstance());
        FutureTask futureTask2 = new FutureTask(() -> Demo02.getInstance());

        new Thread(futureTask1).start();
        new Thread(futureTask2).start();

        Object instance1 = futureTask1.get();
        Object instance2 = futureTask2.get();

        // 有概率会是false
        System.out.println(instance1 == instance2);
    }
}

class Demo02 {
    // 1.私有化类的构造器
    private Demo02() {
    }

    // 2.在内部静态声明,没初始化
    private static Demo02 instance = null;

    // 声明一个公共静态的返回这个实例对象的方法
    public static Demo02 getInstance() {
        // 判断是否实例化过
        if (instance == null) {
            // 实例赋值
            instance = new Demo02();
        }
        return instance;
    }
}

线程安全写法

public synchronized static Demo02 getInstance() {
    // 判断是否实例化过
    if (instance == null) {
        // 实例赋值
        instance = new Demo02();
    }
    return instance;
}

此时为线程安全

posted @ 2022-03-08 20:09  CoderCatIce  阅读(19)  评论(0编辑  收藏  举报