单件模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点。用户程序调用时不是每次生成一个新的实例,而是都调用该类的一个唯一的实例。
单例模式(Singleton)它拥有一个私有构造函数,这确保用户无法通过new直接实例它。除此之外,该模式中包含一个静态私有成员变量instance与静态公有方法Instance()。Instance()方法负责检验并实例化自己,然后存储在静态成员变量中,以确保只有一个实例被创建。
实现方式一
1
2
3
4
5
6
7
8
9
10 |
public class Singleton { private
static Singleton instance; private
Singleton (){} public
static Singleton getInstance() { if
(instance == null ) { instance = new
Singleton(); } return
instance; } } |
该方式式线程不安全的,只有在单线程下才能使用,多线程下会出现多个实例的情况,违反单例模式“唯一性”原则。
实现方式二
1
2
3
4
5
6
7
8
9
10 |
public class Singleton { private
static Singleton instance; private
Singleton (){} public
static synchronized Singleton getInstance() { if
(instance == null ) { instance = new
Singleton(); } return
instance; } } |
方式二是线程安全的,但是会影响系统效率以及占用额外的资源,因为同步在大部分情况下都不需要。
实现方式三
1
2
3
4
5
6
7
8 |
public class Singleton { private
Singleton instance = new
Singleton(); static
{ } private
Singleton (){} public
static Singleton getInstance() { return
this .instance; } |
方式三避免了多线程的同步问题,但是,instance在类加载时就实例化,虽然导致类装载的原因有很多种,在单例模式中大多数都是调用getInstance方法, 但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化instance显然没有达到lazy loading的效果。
实现方式四
1
2
3
4
5
6
7
8
9 |
public class Singleton { private
static class SingletonHolder { private
static final Singleton INSTANCE = new
Singleton(); } private
Singleton (){} public
static final Singleton getInstance() { return
SingletonHolder.INSTANCE; } } |
该方式通过内部静态类实现instance的实例化,避免了第三种方式在类加载时就实例化的问题,只有在调用getInstance方法时才主动去实例化,实现了lazy loading的效果。
实现方式五
1
2
3
4
5
6
7
8
9
10
11
12
13
14 |
public class Singleton { private
volatile static Singleton singleton; private
Singleton (){} public
static Singleton getSingleton() { if
(singleton == null ) { synchronized
(Singleton. class ) { if
(singleton == null ) { singleton = new
Singleton(); } } } return
singleton; } } |
经典的Double-Checked Locking方法
单例模式(Singleton),布布扣,bubuko.com
原文:http://www.cnblogs.com/tmj-home/p/3600990.html