24种设计模式之单例模式(singleton)

24种设计模式之单例模式(singleton)

饿汉模式:推荐使用

package com.dahan;

/**
 * 饿汉式:推荐使用
 * 简单使用  JVM堆内存中种只有一个线程安全
 */
public class PersonTest {
    private static final PersonTest INSTANCE = new PersonTest();

    /**
     * 私有的构造方法 避免别人new一个对象
     */
    private PersonTest(){

    }

    public static PersonTest getInstance() {
        return INSTANCE;
    }

    public void m(){
        System.out.println("单例饿汉模式");
    }
    /**
     * 测试方法
     * @param args
     */
    public static void main(String[] args) {
        PersonTest instance1 = PersonTest.getInstance();
        PersonTest instance2 = PersonTest.getInstance();
        // 判断是否为一个实例
        System.out.println(instance1 == instance2);// true
    }

}

懒汉模式:不推荐

  1. 按需加载,不占用过多内存
  2. 需要处理线程不安全
  3. 加锁线程钱安全,但效率低
package com.dahan;

/**
 * 懒汉式:不推荐
 * 效率低 需要处理线程不安全
 */
public class PersonTest2 {
    private static PersonTest2 INSTANCE = null;

    /**
     * 私有的构造方法 避免别人new一个对象
     */
    private PersonTest2(){

    }

    public static PersonTest2 getInstance() {
        if(INSTANCE == null){
            // 双重检查
            synchronized (PersonTest2.class){
                if(INSTANCE == null){
                    INSTANCE = new PersonTest2();
                }
            }
        }
        return INSTANCE;
    }

    public void m(){
        System.out.println("单例懒汉模式");
    }
    /**
     * 测试方法
     * @param args
     */
    public static void main(String[] args) {
        PersonTest2 instance1 = PersonTest2.getInstance();
        PersonTest2 instance2 = PersonTest2.getInstance();
        // 判断是否为一个实例
        System.out.println(instance1 == instance2);
    }

}

静态内部类模式:推荐 最完美的方式

package com.dahan;

/**
 * 静态内部类模式:推荐使用 最完美的方式
 * 简单使用  JVM堆内存中种只有一个线程安全
 */
public class PersonTest3 {
    /**
     * 私有的构造方法 避免别人new一个对象
     */
    private PersonTest3() {

    }

    /**
     * 静态内部类
     */
    private static class PersonTest3Holder {
        private final static PersonTest3 INSTANCE = new PersonTest3();
    }

    public static PersonTest3 getInstance() {
        return PersonTest3Holder.INSTANCE;
    }

    public void m() {
        System.out.println("m");
    }

    /**
     * 测试方法
     *
     * @param args
     */
    public static void main(String[] args) {
        PersonTest3 instance1 = PersonTest3.getInstance();
        PersonTest3 instance2 = PersonTest3.getInstance();
        // 判断是否为一个实例
        System.out.println(instance1 == instance2);
    }

}

java之父推荐:解决线程同步、反序列化解决等问题

package com.dahan;

/**
 * java之父推荐:解决线程同步、反序列化解决等问题
 */
public enum PersonTest4 {
    INSTANCE;

    public void m() {
        System.out.println("m");
    }

    /**
     * 测试方法
     *
     * @param args
     */
    public static void main(String[] args) {
        PersonTest4 instance1 = PersonTest4.INSTANCE;
        instance1.m();
        PersonTest4 instance2 = PersonTest4.INSTANCE;
        instance2.m();
        // 判断是否为一个实例
        System.out.println(instance1 == instance2);
    }

}
posted @ 2023-01-28 23:17  土木转行的人才  阅读(19)  评论(0编辑  收藏  举报