美文网首页
Java线程安全的单例模式

Java线程安全的单例模式

作者: MoneyGodChina盛忠 | 来源:发表于2018-12-27 22:25 被阅读0次

前言

很多人比较熟悉单例模式,而且单例涉及的知识也不少,如果采用同步锁判断实现单例,有如下几点:

  • 利用私有访问控制符设置构造函数Constructor,从而禁止通过new创建对象实例。
  • 静态成员的类加载过程
  • 懒汉模式和饿汉模式
  • 多线程的同步锁synchronized效率优化问题
  • volatile关键词所涉及的JVM工作内存与主内存的同步问题。
  • 序列化和反序列化通过反射创建新的实例对象并返回的问题,以及通过重载readResolve()方法避免返回新实例的方法。

** 如果采用静态内部类只会被加载一次的特性来实现单例模式的话,还需要使用一下知识:**

  • 静态内部类与静态成员和静态方法有所不同,静态内部类是在被访问的时候会被有且只有加载一次。
  • 静态内部类的加载是由类加载器加载并初始化的,而类加载方法loadClass利用了synchronized 实现同步锁,所以是线程安全的。

** 如果利用枚举来实现当例 **

  • 利用枚举的线程安全
  • 枚举在序列化和反序列化时不受反射影响
  • 枚举实现单例缺点:需要花费至少两倍以上的内存空间,不适合android使用

下面展示单例代码

# 同步锁判断实现单例
public class Singleton {
    private static volatile Singleton singleton = null;
 
    private Singleton(){}
 
    public static Singleton getSingleton(){
        if(singleton == null){
            synchronized (Singleton.class){
                if(singleton == null){
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }    
  #  避免序列化和反序列化破坏单例模式
   private Object readResolve() {
        return singleton;
    }
}

缺点: 读取效率差,代码相对复杂

# 静态内部类实现单例
public class Singleton {
    private static class Holder {
        # 存放在静态内部类里面的单例引用
        private static Singleton singleton = new Singleton();
    }

    private Singleton(){}

    # 获取单例对象的方法
    public static Singleton getSingleton(){
        return Holder.singleton;
    }
}

缺点: 会被序列化和反序列化破坏单例结构

# 枚举法实现单例
public enum Singleton {
    INSTANCE;
    private String name;
    public String getName(){
        return name;
    }
    public void setName(String name){
        this.name = name;
    }
}

缺点:需要花费至少两倍以上内存,不适合移动端使用。

相关文章

  • Java 单例模式

    概述 Java中单例模式是一种常见的设计模式,单例模式总共有7种写法。 懒汉,线程不安全 懒汉,线程安全 饿汉 饿...

  • Kotlin 的单例模式

    Kotlin 的单例模式 1. 在 Java 中的单例模式 懒汉式单例模式,并且是线程安全 2. 在 Kotlin...

  • 单例模式的常用实现方式

    单例模式属于最常用的设计模式,Java中有很多实现单例模式的方式,各有其优缺点 实现方式对比 单例实现方式线程安全...

  • 单例

    单例,是Java中很重要的一个设计模式。 实现单例是要考虑并发(线程安全)问题的。 如何实现一个线程安全的单例?你...

  • 单例模式汇总

    Java单例模式 java单例模式是为了让全局只实例化一个对象,常用的方式包括懒汉模式、饿汉模式,考虑到线程安全,...

  • kotlin实现单例

    java实现单例模式 一直习惯于java的写法,java实现单例主要的思想是构造函数私有,然后考虑线程安全,在实现...

  • Kotlin设计模式-单例模式

    单例模式是项目中最常见的工具类使用模式 kotlin中单例的最佳实践方式,线程安全的懒汉模式 java中调用 ko...

  • 设计模式

    手写单例模式(线程安全) 你知道几种设计模式?单例模式是什么?Spring中怎么实现单例模式?

  • 设计模式(2) 单例模式

    单例模式 线程安全的Singleton 会破坏Singleton的情况 线程级Singleton 单例模式是几个创...

  • 深入理解 Java 内存模型

    一、概述 在之前 单例模式的Java实现与思考 一文里讲到,为了使用 DCL 实现线程安全的单例模式,需要对实例变...

网友评论

      本文标题:Java线程安全的单例模式

      本文链接:https://www.haomeiwen.com/subject/lwodlqtx.html