博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java设计模式之单例模式
阅读量:4655 次
发布时间:2019-06-09

本文共 2631 字,大约阅读时间需要 8 分钟。

单例模式:作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

特点:

  1. 单例类只能有一个实例
  2. 单例类必须自己创建自己的唯一实例
  3. 单例类必须给所有其他对象提供这一实例

饿汉式单例类:

特点:典型的空间换时间,不管你用不用都会创建出一个实例

package singleton;/** * 饿汉式单例:典型的空间换时间,不管你用不用都会创建出一个实例 */public class EagerSingleton {    private static EagerSingleton instance = new EagerSingleton();    /**     * 构建私有的构造器     */    private EagerSingleton(){            }    /**     * 静态工厂方法     * @return     */    public static EagerSingleton getInstance(){        return instance;    }}

懒汉式单例类:

特点:典型的时间换空间,需要用到的时候 再创建对象;

package singleton;/** * 懒汉单例:典型的时间换空间,需要用到的时候 再创建对象; *      虽然它是线程安全的,但是会降低整个访问的速度,而且每次都要判断。 */public class LazySingleton {    private static LazySingleton instance = null;        private LazySingleton(){            }    public static synchronized LazySingleton getInstance(){        if (instance == null) {            instance = new LazySingleton();        }        return instance;    }}

双重检查加锁类:

特点:即实现线程安全,又能够时性能不受很大的影响;

第一重检查:并不是每次进入getInstance方法都需要同步,而是先不同步,进入方法后,先检查实例是否存在,如果不存在才进行下面的同步块;

第二重检查:进入同步块过后,再次检查实例是否存在,如果不存在,就在同步的情况下创建一个实例;

package singleton;/** * 双重检查枷锁:即实现线程安全,又能够时性能不受很大的影响; * 第一重检查:并不是每次进入getInstance方法都需要同步,而是先不同步,进入方法后,先检查实例是否存在,如果不存在才进行下面的同步块; * 第二重检查:进入同步块过后,再次检查实例是否存在,如果不存在,就在同步的情况下创建一个实例; *  */public class Singleton {    //被volatile修饰的变量的值,将不会被本地线程缓存,所有对该变量的读写都是直接操作共享内存,从而确保多个线程能够正确的处理该变量。    //注意:在Java1.4及以前版本中,很多jvm对于volatile关键字的实现的问题,会导致“双重检查加锁”的失败,因此“双重检查加锁”机制只能用在java5及以上的版本。    private static volatile Singleton instance = null;    private Singleton(){}    public static Singleton getInstance(){        //先检查实例是否存在,如果不存在才进入下面的同步代码块        if (instance == null) {            //同步块,线程安全的创建实例            synchronized (Singleton.class) {                //再次检查实例是否存在,如果不存在才真正的创建实例                if (instance == null) {                    instance = new Singleton();                }            }        }        return instance;    }}

懒加载内部实现:

特点:实现了延迟加载和线程安全

package singleton;public class Singleton {    private Singleton(){}    /**     * 类及的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例没有绑定关系,     * 而且只有被调用到时才会装载,从而实现了延迟加载。     */    private static class SingletonHolder{        /**         * 静态初始化器,由JVM来保证线程安全         */        private static Singleton instance = new Singleton();    }    public static Singleton getInstance(){        return SingletonHolder.instance;    }}

枚举单例类:

特点:

简单、无偿的提供了序列化机制,并由JVM根本上提供保障,绝对防止多次实例化,是更简洁、高效、安全的实现单例的方式。

public enum Singleton {    /**     * 定义一个枚举的元素,它就代表了Singleton的一个实例。     */        uniqueInstance;        /**     * 单例可以有自己的操作     */    public void singletonOperation(){        //功能处理    }}

 

 

转载于:https://www.cnblogs.com/hujinshui/p/9589584.html

你可能感兴趣的文章
四川红油的制法
查看>>
Java重写《C经典100题》 --21
查看>>
【Android基础】Fragment 详解之Fragment生命周期
查看>>
链表(裸题)
查看>>
11运算符重载
查看>>
磁盘系统的管理
查看>>
C/S
查看>>
Http Get/Post请求的区别
查看>>
STM32一键下载电路设计原理
查看>>
C语言中函数返回字符串的四种方法
查看>>
10月区块链领域投融资事件盘点
查看>>
Mybatis缓存策略
查看>>
卷积的意义【转】
查看>>
android图形系统详解五:Android绘制模式
查看>>
[剑指offer] 23. 二叉搜索树的后序遍历序列
查看>>
canvas绘画交叉波浪
查看>>
Linux 内核分析
查看>>
试一下:XP ( SP2 ) 本身就支持查杀流氓软件!
查看>>
centos6(7) minimal 基本环境配置
查看>>
maven 构建可执行jar文件
查看>>