美文网首页
单利的三种写法

单利的三种写法

作者: MDZZ灭顶之灾12138 | 来源:发表于2018-09-22 18:16 被阅读23次

double-check线程安全,适用于高并发。

public class DoubleCheck{
        private volatile static  DoubleCheck ins;
        private DoubleCheck(){}
        public static DoubleCheck getIns() {
            if (null == ins) {
                synchronized (DoubleCheck.class) {
                    if (null == ins) {
                        ins = new DoubleCheck();
                    }
                }
            }
            return ins;
        }
    }

执行ins = new DoubleCheck():

  1. 给ins分配内存
  2. 调用构造函数来初始化成员变量(可能会很久)
  3. 将ins对象指向分配的内存空间(执行完这一步,ins才不为空)
    以上的操作不是原子操作,jvm也可能重新排序指令,导致2,3步顺序可能会被打乱,,当第3步先于第2步完成,就会导致有的线程拿到了初始化未完毕的ins,就会出错。可以利用volatile禁止指令重新排序优化特性来解决。

饿汉式:

public class Early{
    private Early(){}
    private static final Early ins = new Early();
    public static Early getIns() {
        return ins;
    }

内部类方式,比饿汉式更优秀,Effective Java 推荐

public class Singleton{
        private Singleton(){}
        private static class Holder {
            private static final Singleton ins = new Singleton();
        }
        public static Singleton getIns() {
            return Holder.ins;
        }
    }

经典模式:

public class Singleton{
    private static Singleton ins;
    private Singleton(){}
    public static synchronized Singleton getIns() {
        if (null == ins) {
            ins = new Singleton();
        }
        return ins;
    }
}

延迟实例化,节省资源。但是synchronized,每次调用getIns()都得同步,很消耗性能。只需在第一次执行的时候同步,当ins实例化之后就不需要同步了。

相关文章

  • 单利的三种写法

    double-check线程安全,适用于高并发。 执行ins = new DoubleCheck(): 给ins分...

  • swift 单利的三种写法

    1.全局变量(单行单利方法) swift单利几种写法的演变过程[http://www.cocoachina.com...

  • 2019-06-10

    swift中单利的写法 懒加载

  • 单利的正确写法

    1.不再是常用的gcd模式。https://www.cnblogs.com/selfing/p/4439234.h...

  • 单例模式

    /**单利模式的特点与写法 单利模式的类不能new,只能通过类提供的getInstance方法创建对象,而且单例模...

  • Kotlin单例的五种写法

    前言 单利模式是写代码过程中不可避免用到的,下面我总结一下单利常用的五中写法 加载类时创建单利 Java实现 Ko...

  • iOS SQLite(数据库)

    iOS - SQL 1>单利写法创建方式 只有一个对象// 单利不能够被释放哦,内存管理中要使用数据库第一步要导入...

  • 生产者消费者模型

    三种写法

  • ES6笔记

    定义组件的三种写法 传统写法 es6写法 stateless 的写法(推荐) const、var、let cons...

  • OC中的一些修饰关键字

    nullable: 表示对象可以为空下面是三种写法: nonnull: 表示对象不能为空下面是三种写法: null...

网友评论

      本文标题:单利的三种写法

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