文档章节

java 设计模式之单例模式

Loveror_ahu
 Loveror_ahu
发布于 2017/09/07 14:51
字数 1001
阅读 6
收藏 0

单例模式:在一个类的使用过程中,始终只保证有一个实例。即在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。

其特点:

1)、某个类只能有一个实例

2)、该类必须自行创建这个实例

3)、该类必须自行向整个系统提供这个实例

这个模式的应用优势在于:

1、某些类创建比较频繁,对于一些大型的对象,这将是很大的系统开销。

2、省去了new,降低了系统内存的使用频率,减轻GC压力。

3、有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了。所以只有使用单例模式,才能保证核心交易服务器独立控制整个流程。

代码实现有如下方式:

/**
 *线程不安全
 * 
 * @Description:
 * @author Biejh
 * @date 2017年9月6日 下午5:28:08
 */
class singleInstance {
    private singleInstance() {

    }
    private static singleInstance single = null;

    public singleInstance getInstance() {
	if (single == null) {
	    return new singleInstance();
	} else {
	    return single;
	}
    }
}

这样的类可以满足基本要求,却是一个毫无线程安全保护的类,如果把它放入多线程的环境下,就会出现问题了,如何解决?我们首先会想到对getInstance方法加synchronized关键字,如下

/**
 * 线程不安全,解决方案1
 * 同步
 * @Description:
 * @author Biejh
 * @date 2017年9月6日 下午5:28:08
 */
class singleInstance2 {
    private singleInstance2() {

    }

    private static singleInstance2 single = null;

    public singleInstance2 getInstance() {
	if (single == null) {
	    synchronized (singleInstance2.class) {
		if (single == null) {
		    return new singleInstance2();
		}
	    }
	}
	return single;
    }
}

/**
 * 线程不安全,解决方案2
 * 同步
 * @Description:
 * @author Biejh
 * @date 2017年9月6日 下午5:28:08
 */
class singleInstance3 {
    private singleInstance3() {

    }
    private static singleInstance3 single = null;

    public synchronized singleInstance3 getInstance() {
	if (single == null) {
	    return new singleInstance3();
	    }
	return single;
    }
}

方案2的synchronized关键字锁住的是这个对象,这样的用法,在性能上会有所下降,因为每次调用getInstance(),都要对对象上锁,事实上,只有在第一次创建对象的时候需要加锁,之后就不需要了,所以,这个地方需要改进。我们改成方案1的将synchronized关键字加在了内部,也就是说当调用的时候是不需要加锁的,只有在instance为null,并创建对象的时候才需要加锁,性能有一定的提升。但是,这样的情况,还是有可能有问题的,看下面的情况:在Java指令中创建对象和赋值操作是分开进行的,也就是说instance = new Singleton();语句是分两步执行的。但是JVM并不保证这两个操作的先后顺序,也就是说有可能JVM会为新的Singleton实例分配空间,然后直接赋值给instance成员,然后再去初始化这个Singleton实例。

/**
 * 线程不安全,解决方案3
 * 内部类
 * @Description:
 * @author Biejh
 * @date 2017年9月6日 下午5:28:08
 */
public class SingleInstance {
    
    private SingleInstance() {

    }
    private static class getSinge{
	private static final SingleInstance  instance4 = new SingleInstance();
    }
    public static SingleInstance getInstance() {
	return getSinge.instance4;
    }

}

单例模式使用内部类来维护单例的实现,JVM内部的机制能够保证当一个类被加载的时候,这个类的加载过程是线程互斥的。这样当我们第一次调用getInstance的时候,JVM能够帮我们保证instance只被创建一次,并且会保证把赋值给instance的内存初始化完毕,这样我们就不用担心上面的问题。同时该方法也只会在第一次调用的时候使用互斥机制,这样就解决了低性能问题。

/**
 * 线程安全
 * 
 * @Description:
 * @author Biejh
 * @date 2017年9月6日 下午5:29:36
 */
class singleInstance1 {
    private singleInstance1() {
    }

    private static final singleInstance1 single = new singleInstance1();

    public singleInstance1 getInstance() {
	return single;
    }
}

这样在定义类的时候就直接给一个final修饰的实例,并将一直使用下去而不发生改变,因此其是线程安全的,也没有什么性能开销。

© 著作权归作者所有

共有 人打赏支持
下一篇: Java类加载理解
Loveror_ahu
粉丝 1
博文 17
码字总数 16911
作品 0
南京
程序员
私信 提问
设计模式 2014-12-19

book: 阎宏《JAVA与模式》 架构设计栏目 http://blog.csdn.net/enterprise/column.html 概要: http://bbs.csdn.net/forums/Embeddeddriver 23种设计模式分别是: 1.单例模式 2.工厂方法模式...

jayronwang
2014/12/19
0
0
设计模式15——Template Method设计模式

Template Method模板方法设计模式定义一个操作中算法的骨架,将具体步骤的执行延迟到子类中实现。Java中的抽象类就是使用了模板方法设计模式。模板方法设计模式结构如下: 以文档处理为例,T...

小米米儿小
2014/01/24
0
0
简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

转载:原地址http://www.cnblogs.com/zhangchenliang/p/3700820.html 简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别 结合简单示例和UML图,讲解工厂模式简单原理。 一、引子 话说...

法斗斗
2018/05/08
0
0
策略模式与SPI机制,到底有什么不同?

这里说的策略模式是一种设计模式,经常用于有多种分支情况的程序设计中。例如我们去掉水果皮,一般来说对于不同的水果,会有不同的拨皮方式。此时用程序语言来表示是这样的: 如上面代码所写...

陈树义
2018/09/03
0
0
学了那么多年设计模式依然不会用!那可真蠢!

什么是设计模式? 设计模式(Design Pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决...

GitChat技术杂谈
2018/10/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

全面理解Java内存模型(JMM)及volatile关键字

理解Java内存区域与Java内存模型 Java内存区域 Java虚拟机在运行程序时会把其自动管理的内存划分为以上几个区域,每个区域都有的用途以及创建销毁的时机,其中蓝色部分代表的是所有线程共享的...

亭子happy
20分钟前
1
0
Prometheus监控mysql实例--centos7安装mysql_exporter

目录 概述 环境准备 普罗米修斯简介 mysql安装 mysqld_exporter安装 启动参数列表 概述 prometheus(普罗米修斯) 是一个开源系统监控和报警工具包,许多公司和组织都采用了Prometheus,该项目...

java_龙
25分钟前
3
0
拥有2000家门店,他如何晋升为服装界的新宠?

摘要: —— iwarm3.0加热组件、碳纳米管膜炎、管状石墨结构体...你看到并不是一款高科技电子产品,这是快鱼服饰在这个冬天推出的黑科技产品 - 智能温控羽绒服。 在竞争激烈的服装行业,快鱼...

阿里云云栖社区
27分钟前
2
0
不忘初心 砥砺前行-智和信通2018年年会报道

1月18日,智和信通以“不忘初心 砥砺前行”为主题的2018总结会议暨2019年年会在京召开。年会以总经理李少龙的讲话为开场,充分肯定了全体员工2018年的工作和成绩,并表达了公司产品智和网管平...

智和网管平台
36分钟前
1
0
NGINX api网关

以谁为师
37分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部