设计模式——单例模式

单例模式

单例模式顾名思义就是只存在一个实例,在很多情况下我们不需要这个对象有多个实例,所以有了我们的单例模式。

这里只列举两种单例模式

线程安全的饿汉模式

/**
 * 线程安全的饿汉模式
 */
public class Hungry {
    public static Hungry hungry=new Hungry();
    private Hungry(){}
    public static final Hungry newInstance(){
        return hungry;
    }
}

懒汉模式

/**
 * 懒汉模式(线程不安全)
 */
public class Lazy {
    public static Lazy lazy=null;
    private Lazy(){}

    public static Lazy newInstance() {
        if (lazy==null){
            lazy=new Lazy();
        }
        return lazy;
    }
}

懒汉模式如果需要线程安全那么需要加

synchronized
/**
 * 懒汉模式(线程安全)
 */
public class LazyTwo {
    public static LazyTwo lazy=null;
    private LazyTwo(){}

    public synchronized static LazyTwo newInstance() {
        if (lazy==null){
            lazy=new LazyTwo();
        }
        return lazy;
    }
}

这里加锁对性能的影响是比较大的,可以考虑内部类去改进,这里不再演示

当单例遇到序列化的问题的时候,因为当对象实现了

Serializable

接口以后jvm会调用readResolve()方法所以我们需要这样写

/**
 * 线程安全的饿汉模式
 */
public class Hungry implements Serializable {
    public static Hungry hungry=new Hungry();
    private Hungry(){}
    public static final Hungry newInstance(){
        return hungry;
    }

    /**
     * 当实现Serializable接口后,序列化问题,反序列的时候jvm会调用这个方法,所以重新即可
     * @return
     */
    private Object readResolve(){
        return hungry;
    }
}

单例还有很多种写法,这里不再一一列举,只列举常见的2种普通的单例,我们需要了解的是这样的一个思想

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值