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);
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值