简单引入

单例设计模式作为最简单,最常用的设计模式。一般是这两中写法,这两种写法教科书所谓的标准写法,但是实际上存在不少问题。后面介绍标准写法,以规避这些问题。

1.懒汉式:


/**
* 问题在于,当多线程工作的时候,如果有多个线程同时运行到if (instance ==
* null),都判断为null,那么两个线程就各自会创建一个实例——这样一来,就不是单例了。
*/
class Singleton { private Singleton() {
}; private static Singleton s; public static Singleton getInstance() {
if (s == null) {
s = new Singleton();
}
return s;
} }

2.恶汉式

class Singleton {
private Singleton() {
} private static Singleton singleton = new Singleton(); public static Singleton getInstance() {
return singleton;
} }

标准写法

改变懒汉式1.

(规避线程安全问题)加上 synchronized修饰方法即可

class Singleton {

	private Singleton() {
}; private static Singleton s; public static synchronized Singleton getInstance() {
if (s == null) {
s = new Singleton();
}
return s;
} }

改变懒汉式2. 双重检查 Double-Check』写法

1.第一个if 只有instance为null的时候,才进入synchronized的代码段——大大减少了几率。

2.第二个if 是为了防止可能出现多个实例的情况。

 class DoubleCheck {

	private DoubleCheck() {
} private static DoubleCheck dCheck; public static DoubleCheck getInstance() {
if (dCheck == null) {
synchronized (DoubleCheck.class) {
if (dCheck == null) {
dCheck = new DoubleCheck();
}
}
}
return dCheck;
} }

改变懒汉式2.之终极版 防止指令重排列 volatile

不知道原子操作,与指令重排的建议复习下

 class DoubleCheck2 {
private DoubleCheck2() {
} private static volatile DoubleCheck2 sCheck; public static DoubleCheck2 getInstance() {
if (sCheck == null) {
synchronized (DoubleCheck2.class) {
if (sCheck == null) {
sCheck = new DoubleCheck2();
}
}
}
return sCheck;
} }

1.恶汉式:

说白了,有classloder装载 就是一开始就创建类

/*
* 缺点也就只是饿汉式单例本身的缺点所在了——由于INSTANCE的初始化是在类加载时进行的,而类的加载是由ClassLoader来做的,
* 所以开发者本来对于它初始化的时机就很难去准确把握:
*
* 可能由于初始化的太早,造成资源的浪费 如果初始化本身依赖于一些其他数据,那么也就很难保证其他数据会在它初始化之前准备好。
*/
class Singleton {
private Singleton() {
} private static final Singleton singleton = new Singleton(); public static Singleton getInstance() {
return singleton;
} }

由于静态内部类实现

class innerSingleton {
private innerSingleton() { } private static class SingletonHolder {
private static final innerSingleton SINGLETON = new innerSingleton();
} public static innerSingleton getInstance() {
return SingletonHolder.SINGLETON;
} }

单例设计模式singleton的更多相关文章

  1. 单例设计模式Singleton之懒加载模式(懒汉模式)【原】

    单例设计模式Singleton之懒加载模式(懒汉模式) SingletonLazy.java类 package kingtool; import kingtool.http.IPTool; publi ...

  2. Java学习笔记——单例设计模式Singleton

    单例设计模式:singleton 解决的问题: 确保程序在运行过程中,某个类的实例instance只有一份. 特点: 1 构造函数私有化 2 自己内部声明自己 3 提供一个public方法,负责实例化 ...

  3. Java学习笔记(二十四):单例设计模式singleton

    为什么要使用singleton设计模式? 假设设计了一个操作数组的工具类(Tools),里面有一个锤子的方法(Hammer),如果不使用singleton设计模式,每次想调用Hammer方法都需要ne ...

  4. Java设计模式—单例设计模式(Singleton Pattern)全然解析

    转载请注明出处:http://blog.csdn.net/dmk877/article/details/50311791 相信大家都知道设计模式,听的最多的也应该是单例设计模式,这种模式也是在开发中用 ...

  5. 转:java单例设计模式

    本文转自:http://www.cnblogs.com/yinxiaoqiexuxing/p/5605338.html 单例设计模式 Singleton是一种创建型模式,指某个类采用Singleton ...

  6. 小菜学习设计模式(二)—单例(Singleton)模式

    前言 设计模式目录: 小菜学习设计模式(一)—模板方法(Template)模式 小菜学习设计模式(二)—单例(Singleton)模式 小菜学习设计模式(三)—工厂方法(Factory Method) ...

  7. 设计模式的征途—1.单例(Singleton)模式

    单例模式属于创建型模式的一种,创建型模式是一类最常用的设计模式,在软件开发中应用非常广泛.创建型模式将对象的创建和使用分离,在使用对象时无需关心对象的创建细节,从而降低系统的耦合度,让设计方案更易于修 ...

  8. java singleton(单例设计模式)

    单例设计模式的主要作用是: 1.控制资源的使用,我们对资源使用线程同步来实现并发访问. 2.节约资源,我们对一个类只进行一个实例化进行全局的资源访问,节约了内存. 3.作为通信媒介,也是数据共享,可以 ...

  9. Java基础 static限定符的使用 以及【 static实现的 singleton(单例)设计模式】

    static实现的 singleton(单例)设计模式 /** static实现的 singleton设计模式 , 使得一个类只能够创建一个static对象 */ 模板设计结构: package Co ...

随机推荐

  1. oracle数据库如何备份一张表

    --用户名:tms--创建表ts_dictionary的备份create table ts_dictionary_20160715 as select * from ts_dictionary; 补充 ...

  2. MySQL Unable to convert MySQL date/time value to System.DateTime的解决办法

    在连接串中加入 Convert Zero Datetime=True

  3. 三年java软件工程师应有的技技能

    摘要:http://blog.csdn.net/jieinasiainfo/article/details/51177729 http://blog.csdn.net/kangqianglong/ar ...

  4. 机器视觉 之 Gabor Feature

    在机器视觉中,gabor feature是一种比较常见的特征,因为其可以很好地模拟人类的视觉冲击响应而被广泛应用于图像处理, gabor feature 一般是通过对图像与gabor filter做卷 ...

  5. AtCoder Regular Contest 074 E:RGB Sequence

    题目传送门:https://arc074.contest.atcoder.jp/tasks/arc074_c 题目翻译 给你一行\(n\)个格子,你需要给每个格子填红绿蓝三色之一,并且同时满足\(m\ ...

  6. mac下nginx的安装

    新手初学,按照网上的教程,一步一步来进行安装.把自己的安装流程贴出来. 1 安装nginx需要三方的lib库pcre.因此先下载pcre. 在这里,需要注意的是安装的pcre的版本要与nginx对应. ...

  7. JavaScript-Tool:three.js

    ylbtech-JavaScript-Tool:three.js Three.js 是一款运行在浏览器中的 3D 引擎,你可以用它创建各种三维场景,包括了摄影机.光影.材质等各种对象.你可以在它的主页 ...

  8. jquery/原生js/css3 实现瀑布流以及下拉底部加载

    思路: style: <style type="text/css"> body,html{ margin:; padding:; } #container{ posit ...

  9. exsi thick convert to thin

    http://gaoming.blog.51cto.com/822334/1176139

  10. spring加载hibernate映射文件的几种方式

    1. 在Spring的applicationContext.xml中配置映射文件,通常是在<sessionFactory>这个Bean实例中进行的,若配置的映射文件较少时,可以用sessi ...