单例模式(Singleton)续——有效解决多线程问题
《JDK源码解析》的分支,讲解设计模式在jdk中使用。
上一篇博客,讲到了单例模式(Singleton),提到了多线程问题。这次,我们来看看几个有效解决单例模式中多线程问题的解法。
上一篇博客提到的最后一种方法,虽然能解决多线程环境下的问题,但是有效率低下的缺点,因为每次使用getInstance()方法时,都会synchronized,明显影响效率。
一、”两次判断法“(效率依然会有影响)
public class SingletonTest { private static SingletonTest singletonTest = null; private static Object syncObj = new Object(); private SingletonTest() { } public static SingletonTest getInstance() { if (null == singletonTest) //第一次判断 { synchronized (syncObj) { if (null == singletonTest) //第二次判断 { singletonTest = new SingletonTest(); } } } return singletonTest; } }
结论:
(1)这样会使得当第一次判断为false的时候,不进入同步块,使得效率比原方法高。
(2)但是:两次判断,使得代码复杂易错,不是很推荐。
二、”静态成员变量法“(上一篇博客已讲)
public class SingletonTest { //在类里面实例化静态成员变量 private static SingletonTest singletonTest = new SingletonTest(); private SingletonTest() { } public static SingletonTest getInstance() { return singletonTest; } }
结论:
(1)使用类的构造方法时初始化静态变量,创建唯一的静态实例。
(2)简洁,效率高!(无锁)
(3)但是:因为只要使用SingletonTest类,默认创建实例(不管需不需要这个实例)。这种默认创建实例,会导致内存使用效率的降低!
三、”按需创建“方法(感谢fisher123的指点)
public class SingletonTest { private SingletonTest() { } private static class Inner //私有的静态内部类 { static SingletonTest singletonTest = new SingletonTest(); } public static SingletonTest getInstance() { return Inner.singletonTest; } }
结论:
(1)私有的静态内部类,当不调用getInstance()方法时,就不会调用这个内部类,就不会产生实例。
(2)没有使用锁,没有产生无用的实例。确实是最好的方法。
相关推荐
简单的单例模式举例Singleton 分为恶汉式 懒汉式
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个...
单例模式的特点有三: 单例类只能有一个实例。 单例类必须自己创建自己的唯一实例。 单例类必须给所有其他对象提供这一实例。 Singleton模式包含的角色只有一个,就是Singleton。Singleton拥有一个私有构造函数,...
设计模式C++学习之单例模式(Singleton)
单例模式 Singleton 单例模式线程安全问题和拓展
java Singleton单例模式 java Singleton单例模式
此示例展示了Qml 的单例模式(类似全局对象,只生成一次实例,可全局使用) surfsky.cnblogs.com
单例模式(Singleton)
一个产生随机数的例子,整个应用程序中只需要一个类的实例来产生随机数,客户端程序从类中获取这个实例,调用这个实例的方法nextInt(),公用的方法访问需要进行同步,这是单例模式需要解决的同步问题。
在Java应用中,单例对象能保证在一个...3、有些像交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了,只有使用单例模式,才能保证核心交易服务器独立控制整个流程。 CSDN代码的详细解释。
单例模式(Singleton)的6种实现
该文当中对Java单类模式有非常细致入微的,循序渐进的讲解。
C++11实现线程安全的单例代码和测试代码,包含singleton.h,main.cpp,希望帮助到大家。
Java面向对象(高级)-- 单例(Singleton)设计模式
设计模式总结-模板设计模式,单例模式(singleTon)
深入浅出Singleton,详细掌握单例模式
4、单例模式(Singleton Pattern) 用意:仅允许生成一个对象时
四种常见的单例: 1、没有构造函数(DEFINE_SINGLETON_DEFAULT); 2、有构造函数,构造函数没有参数(DEFINE_SINGLETON_CONSTRUCT_NO_PARAM); 3、有构造函数,构造函数有没有参数版本(DEFINE_SINGLETON_...
单例设计模式Singleton1