Singleton, 单例模式: 顾名思义,就是只有一个实例。常见的实现方法有以下几种.
1. 懒汉
public class Singleton{
private static Singleton instance = null;
private Singleton(){
}
public static Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
这种实现方式:
1. 非线程安全。并发情况下,可能有多个线程进入if语句块,从而创建了多个实例。
2. 节约内存空间。只有在调用getInstance()的时候才分配对象的空间。
3. 浪费时间。每次调用都要判断instance是否为空。
4. 初始化的时候比较快,而运行时比较慢。
5. 体现了延迟加载的思想。
6. 非线程安全问题,可以通过使用synchronized关键字来处理(后面还会讨论)
2. 饿汉
public class Singleton{
private static final Singleton instance = new Singleton();
private Singleton(){
}
public static Singleton getInstance(){
return instance;
}
}
这种实现方式:
1. 线程安全的。因为类加载的时候,instance对象只被初始化了一次,利用JVM类加载机制来保证线程安全。
2. 牺牲空间。加载类的时候,无论是否使用该类,都分配了内存空间。
3. 初始化的时候稍慢,但是运行时快。
4. 体现了缓存思想。
3. 双重检查加锁机制(对比并优化懒汉方法)
public class Singleton {
private volatile static Singleton instance = null;
private Singleton(){
}
public static Singleton getInstance(){
//先检查实例是否存在,如果不存在才进入下面的同步块
if(instance == null){
//同步块,线程安全的创建实例
synchronized (Singleton.class) {
//再次检查实例是否存在,如果不存在才真正的创建实例
if(instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}
这种实现方式:
1. 线程安全。
2. 加快运行速度。只是第一次创建实例的时候同步,以后都不用同步了。
3. 比在懒汉方式中加入synchronized方法效率高:(如下)
4. volatile修饰的变量值,将不会被本地线程缓存,所有对该变量的读写都是直接操作共享内存。
5. volatile关键字屏蔽掉了JVM中的一些必要的代码优化,所以可能降低一些运行效率(没有验证)。
public static synchronized getInstance(){
}
4. 更优解决方案
public class Singleton {
private static class Holder {
private static final Singleton instance = new Singleton();
}
private Singleton() {
}
public static Singleton getInstance() {
return Holder.instance;
}
}
这种实现方法:
1. 使用静态内部类和缺省同步机制实现。
2. 缺省同步机制是指:JVM隐含的执行的同步,这里指静态初始化器(在静态字段或者static{}上的初始化 器)初始化的时候。
3. 类加载的时候并不会像饿汉一样初始化对象,而是在getInstance被调用之后才会。而且JVM保证了线程安 全问题。
分享到:
相关推荐
java Singleton单例模式 java Singleton单例模式
此示例展示了Qml 的单例模式(类似全局对象,只生成一次实例,可全局使用) surfsky.cnblogs.com
singleton单例模式1
单例模式 Singleton 单例模式线程安全问题和拓展
Android Singleton单例模式运用详解
c++ singleton单例模式
本文档,是利用C++来实现设计模式中的,单例模式,里面有内容说明和相关实例代码介绍
C# 23种设计模式之单例模式源码
单例模式的实现,创建,一个文档作为简介
在Java应用中,单例对象能保证在一个...3、有些像交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了,只有使用单例模式,才能保证核心交易服务器独立控制整个流程。 CSDN代码的详细解释。
Singleton pattern单例模式应用
设计模式C++学习之单例模式(Singleton)
主要介绍了使用设计模式中的Singleton单例模式来开发iOS应用程序的例子,示例代码为传统的Objective-C语言,需要的朋友可以参考下
NULL 博文链接:https://linxingliang.iteye.com/blog/1217811
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个...
单例模式,您能写出几个呢?这个PPT将为你全面阐述5种不同形式的单例模式。
一个产生随机数的例子,整个应用程序中只需要一个类的实例来产生随机数,客户端程序从类中获取这个实例,调用这个实例的方法nextInt(),公用的方法访问需要进行同步,这是单例模式需要解决的同步问题。
简单的单例模式举例Singleton 分为恶汉式 懒汉式
深入浅出Singleton,详细掌握单例模式
java设计模式,单例模式的不同实现方式