单例模式作用特点及常见的单例模式分析(6种单例模式分析)

单例模式:

  1. 即在整个生命周期中,对于该对象的生产始终都是一个,不曾变化。
  2. 保证了一个类仅有一个实例,并提供一个访问它的全局访问点。

作用:

  1. 在要求线程安全的情况下,保证了类实例的唯一性,线程安全。
  2. 在不需要多实例存在时,保证了类实例的单一性。不浪费内存。

特点:

  1. 公有的方法获取实例,
  2. 私有的构造方法,
  3. 私有的成员变量。

一,饿汉式
* @Description 饿汉式单例
     * 饿汉式单例关键在于singleton作为类变量并且直接得到了初始化,即类中所有的变量都会被初始化
     * singleton作为类变量在初始化的过程中会被收集进<clinit>()方法中,该方法能够百分之百的保证同步,
     * 但是因为不是懒加载,singleton被加载后可能很长一段时间不被使用,即实例所开辟的空间会存在很长时间
     * 虽然可以实现多线程的唯一实例,但无法进行懒加载;

package com.liruilong.singleton;

/**
 * @Author: Liruilong
 * @Date: 2019/7/20 17:55
 */

// final 不允许被继承
public final class Singleton {
    // 实例变量
    private byte[] bate = new byte[1024];
    // 私有的构造函数,即不允许外部 new
    private Singleton(){ }
    private  static final Singleton singleton1 = new Singleton();
    public static  Singleton getInstance1(){
        return singleton1;
    }

二,懒汉式

* @Description 懒汉式单例模式
     * 可以保证懒加载,但是线程不安全
     * 当有两个线程访问时,不能保证单例的唯一性

package com.liruilong.singleton;

/**
 * @Author: Liruilong
 * @Date: 2019/7/20 17:55
 */

// final 不允许被继承
public final class Singleton {
    // 实例变量
    private byte[] bate = new byte[1024];
    // 私有的构造函数,即不允许外部 new
    private Singleton(){ }

    private static  Singleton singleton =null;
    public static  Singleton getInstance(){
            if (singleton == null) {
                singleton = new Singleton();
            }
                return singleton;
    }

三,懒汉式加同步方法
* @Description 懒汉式+同步方法单例模式
     * 即能保证懒加载,又可以保证singleton实例的唯一性,但是synchronizeed关键字的排他性导致
     * getInstance0()方法只能在同一时间被一个线程访问。性能低下。

package com.liruilong.singleton;

/**
 * @Author: Liruilong
 * @Date: 2019/7/20 17:55
 */

// final 不允许被继承
public final class Singleton {
    // 实例变量
    private byte[] bate = new byte[1024];
    // 私有的构造函数,即不允许外部 new
    private Singleton(){ }

    private static  Singleton singleton =null;
    public static synchronized Singleton getInstance0(){
        if (singleton == null) {
            singleton = new Singleton();
        }
        return singleton;
    }

四,双重效验锁单例
* @Description 双重校验锁单例(Double-Check)+Volatile
     *  对懒汉-同步方法的改进,当有两个线程发现singleton为null时,只有一个线程可以进入到同步代码块里。
     *  即满足了懒加载,又保证了线程的唯一性
     *  不加volition的缺点,有时候可能会报NPE,(JVM运行指令重排序)
     *  有可能实例对象的变量未完成实例化其他线程去获取到singleton变量。
     *  未完成初始化的实例调用其方法会抛出空指针异常。

package com.liruilong.singleton;

/**
 * @Author: Liruilong
 * @Date: 2019/7/20 17:55
 */

// final 不允许被继承
public final class Singleton {
    // 实例变量
    private byte[] bate = new byte[1024];
    // 私有的构造函数,即不允许外部 new
    private Singleton(){ }

    private  static volatile Singleton singleton2 = null;
    public static Singleton getInstance4() {

        if (singleton2 == null){
            synchronized (Singleton.class){
                if (singleton2 ==null){
                    singleton2 = new Singleton();
                }
            }
        }
        return singleton2;
    }

五,静态内部类单例
 * @Description 静态内部类的单例模式
     * 在Singleton类初始化并不会创建Singleton实例,在静态内部类中定义了singleton实例。
     * 当给静态内部类被主动创建时则会创建Singleton静态变量,是最好的单例模式之一

package com.liruilong.singleton;

/**
 * @Author: Liruilong
 * @Date: 2019/7/20 17:55
 */

// final 不允许被继承
public final class Singleton {
    // 实例变量
    private byte[] bate = new byte[1024];
    // 私有的构造函数,即不允许外部 new
    private Singleton(){ }

    private  static class Singtetons{
        private static  Singleton SINGLETON = new Singleton();
       /* static {
             final Singleton SINGLETON = new Singleton();
        }*/

    }
    public static  Singleton getInstance2(){
        return Singtetons.SINGLETON;
    }

六,枚举类单例

* @Description 基于枚举类线程安全
     * 枚举类型不允许被继承,同样线程安全的,且只能被实例化一次。

package com.liruilong.singleton;

/**
 * @Author: Liruilong
 * @Date: 2019/7/20 17:55
 */

// final 不允许被继承
public final class Singleton {
    // 实例变量
    private byte[] bate = new byte[1024];
    // 私有的构造函数,即不允许外部 new
    private Singleton(){ }

    private enum Singtetonss {
        SINGTETONSS; //实例必须第一行,默认 public final static修饰
        private Singleton singleton;

        Singtetonss() { //构造器。默认私有
            this.singleton = new Singleton();
        }
        public static Singleton getInstance() {
            return SINGTETONSS.singleton;
        }
    }
    public static  Singleton getInstance3(){
        return Singtetonss.getInstance();
    }

原本是我笔记里的,摘了出来,面试的时候看,

更多见 ----》《Java并发编程详解》读书笔记

原文地址:https://www.cnblogs.com/liruilong/p/12236742.html

时间: 2024-10-12 08:21:37

单例模式作用特点及常见的单例模式分析(6种单例模式分析)的相关文章

8种单例模式写法助你搞定面试

1. 单例模式常见问题 为什么要有单例模式 单例模式是一种设计模式,它限制了实例化一个对象的行为,始终至多只有一个实例.当只需要一个对象来协调整个系统的操作时,这种模式就非常有用.它描述了如何解决重复出现的设计问题, 比如我们项目中的配置工具类,日志工具类等等. 如何设计单例模式 ? 1.单例类如何控制其实例化 2.如何确保只有一个实例 通过一下措施解决这些问题: private构造函数,类的实例话不对外开放,由自己内部来完成这个操作,确保永远不会从类外部实例化类,避免外部随意new出来新的实例

五种单例模式

今天算是完完整整把老高的单例模式看了,差不多也懂了,个别不懂的再补吧,下面介绍一下5种单例模式: 饿汉式实现:线程安全,调用效率高.但是,不能延时加载. 懒汉式实现:线程安全,调用效率不高.但是,可以延时加载. 双重检测锁式:由于JVM底层内部模型原因,偶尔会出现问题,不建议使用. 静态内部类式:线程安全,调用效率高,可以延时加载. 枚举式:线程安全,调用效率高.但是,不能延时加载(避免反射和反序列化的漏洞). 以下先介绍一下5种单例模式: 饿汉式实现: /** *单例模式:饿汉模式 *线程安全

五种单例模式实现

核心作用: 保证一个类只有一个实例,并向外提供一个访问该实例的访问点. 常见场景: 数据库连接池的设计一般也是单例模式 在Servlet编程中,每个Servlet也是单例模式 在Spring中,默认创建的bean也是单例模式 ...... 优点: 1.由于每个类只创建一个实例,大大减少了内存的开销. 2.单例模式提供全局访问点,可以实现共享资源访问. 常见的五种单例模式实现方法: 饿汉式(线程安全,效率高,不能延迟加载) 懒汉式(线程安全,效率不高,可以延迟加载) DCL懒汉式(线程安全,效率还

Java中的五种单例模式实现方法

[代码] Java中的五种单例模式实现方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 package s

iOS开发笔记-两种单例模式的写法

iOS开发笔记-两种单例模式的写法 单例模式是开发中最常用的写法之一,iOS的单例模式有两种官方写法,如下: 不使用GCD #import "ServiceManager.h" static ServiceManager *defaultManager; @implementation ServiceManager +(ServiceManager *)defaultManager{ if(!defaultManager) defaultManager=[[self allocWith

7、java实现的两种单例模式

/* 两种单例模式的演示 */ //饿汉式 class Signal { private Signal(){} private Signal s = new Signal(); public static Signal getInstance() { return s; } } //懒汉式 class Signal { private Signal(){} private Signal s = null; public static Signal getInstance() { if(s ==

Android源码分析--MediaServer源码分析(二)

在上一篇博客中Android源码分析–MediaServer源码分析(一),我们知道了ProcessState和defaultServiceManager,在分析源码的过程中,我们被Android的Binder通信机制中的各种复杂的类关系搞的眼花缭乱,接下来我们就以MediaPlayerService为例来分析一下Binder的通信机制.首先来回顾一下: BpBinder和BBinder都是Android中Binder通信的代表类,其中BpBinder是客户端用来与Server交互的代理类,p代

JS获取网页中HTML元素的几种方法分析

getElementById getElementsByName getElementsByTagName 大概介绍 getElementById ,getElementsByName ,getElementsByTagName ###adv### 后两个是得到集合,byid只是得到单个对象 getElementById 的用法 举个例子: <a id="link1" name="link1" href=http://homepage.yesky.com>

R语言重要数据集分析研究——需要整理分析阐明理念

1.R语言重要数据集分析研究需要整理分析阐明理念? 上一节讲了R语言作图,本节来讲讲当你拿到一个数据集的时候如何下手分析,数据分析的第一步,探索性数据分析. 统计量,即统计学里面关注的数据集的几个指标,常用的如下:最小值,最大值,四分位数,均值,中位数,众数,方差,标准差,极差,偏度,峰度 先来解释一下各个量得含义,浅显就不说了,这里主要说一下不常见的 众数:出现次数最多的 方差:每个样本值与均值的差得平方和的平均数 标准差:又称均方差,是方差的二次方根,用来衡量一个数据集的集中性 极差:最大值