单例模式

一、什么是单例模式?

    单例:一个类模版,在整个系统运行过程中,只允许产生一个事例(有且只有一个)。 

二、保存单例的技术方案有哪些?

  1. 饿汉式:在实例使用之前,不管用不用,都先new出来,避免了线程安全问题;
/**
 * @ather: lucksheep
 * @date: 2018/8/6 19:46
 * @description: 饿汉式
 */
public class Hungry {

    private Hungry(){}

    //先静态、后动态
    //先属性、后方法
    //先上后下
    private static final Hungry hungry=new Hungry();

    public static Hungry getInstance(){
         return hungry;
    }
}

  1. 懒汉式:默认加载的时候不实例化,在需要用到的时候才实例化,延迟加载;
    第一种:
/**
 * @ather: lucksheep
 * @date: 2018/8/7 11:18
 * @description: 懒汉式
 */
public class LazyOne {

    private LazyOne(){}

    private static LazyOne lazy=null;

    public static LazyOne getInstance(){
        if(lazy==null){
            lazy=new LazyOne();
        }
        return lazy;
    }
}

第二种:

/**
 * @ather: lucksheep
 * @date: 2018/8/9 14:25
 * @description:
 */
public class LazyTwo {

    private LazyTwo(){}

    private static LazyTwo lazy=null;

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

第三种:

/**
 * @ather: lucksheep
 * @date: 2018/8/9 14:25
 * @description:
 */
public class LazyThree {

    private static boolean initialized = false;

    //默认使用LazyThree的时候,先初始化内部类
    //如果没使用,内部类是不加载的
    private LazyThree(){

        //防止反射
        synchronized (LazyThree.class){
            if(initialized == false){
                initialized = !initialized;
            }else{
                throw new RuntimeException("单例已被侵犯,不给你看!");
            }
        }
    }

    public static final synchronized LazyThree getInstance(){
        return LazyHolder.lazy;
    }

    private static class LazyHolder{
        private static final LazyThree lazy=new LazyThree();
    }

}

  1. 注册登记式:每使用一次,都往一个固定的容器中去注册并且将使用过的对象进行缓存,下次去取对象的时候,就直接从缓存中取值,以保证每次获取的都是同一个对象;IOC中的单例模式就是典型的注册登记式单例

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @ather: lucksheep
 * @date: 2018/8/10 15:48
 * @description: 注册登记式
 */
public class RegisterMaps {

    private static Map<String,Object> registerMaps=new HashMap<>();
    //如果要安全的 ConcurrentHashMap

    public static RegisterMaps getInstance(String name){
        if(null == name){
            name = RegisterMaps.class.getName();
        }
        if(registerMaps.get(name) == null){
            registerMaps.put(name,new RegisterMaps());
        }
        return (RegisterMaps) registerMaps.get(name);
    }
}
  1. 枚举式:这个很简单我就不说了。
/**
 * @ather: lucksheep
 * @date: 2018/8/10 15:57
 * @description: 枚举
 */
public enum  RegisterEnum {

    ONE,TWO,Three;

}
  1. 序列化与反序列化单例:如果要保证单例安全,只需要重写 private Object readResolve(){}这个方法。
/**
 * @ather:  lucksheep
 * @date: 2018/8/10 16:07
 * @description: 序列化单例
 */
public class Serializes implements Serializable {

    private static final long serialVersionUID = 3239595067725719650L;

    private Serializes(){}

    public final  static Serializes serializes=new Serializes();

    public static  Serializes getInstance(){
        return serializes;
    }

    /**
     * 加上可以保证单例是安全的
     * 原因:序列化与反序列化中的一个协议,为了实现实例化后,
     *       对象重复利用,它可以实现 readResolve() 这个方法,这个方法是JVM自动去调用的
     * @return
     */
    private Object readResolve(){
        return serializes;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 单例模式(SingletonPattern)一般被认为是最简单、最易理解的设计模式,也因为它的简洁易懂,是项目中最...
    成热了阅读 4,580评论 4 34
  • 前言 本文主要参考 那些年,我们一起写过的“单例模式”。 何为单例模式? 顾名思义,单例模式就是保证一个类仅有一个...
    tandeneck阅读 2,677评论 1 8
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 137,172评论 19 139
  • 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 单例模式的使用很广泛,比如:线程池(threa...
    richy_阅读 412评论 0 0
  • 说明:1、2017年11月11日,我发了一条朋友圈:在这个四柱擎天的日子里想了想,考虑到自己以后基本也就告别自行车...
    邓哲阅读 1,556评论 0 3

友情链接更多精彩内容