单件模式确保一个类只有一个实例,并提供一个全局访问点。
适用于资源敏感的场景。
实现:
//经典实现方式,但是在多线程环境下就会出问题,
//可能连个线程同时进入了uniqueInstance==null那条控制路径
public
class
Singletion {
private
static
Singletion
uniqueInstance
;
private
Singletion() {
}
//
public
static
Singletion getInstance() {
if
(
uniqueInstance
==
null
) {
// 延迟实例化,懒汉式
uniqueInstance
=
new
Singletion();
}
return
uniqueInstance
;
}
}
-----
//对方法加锁,同步线程对其的调用
//但是只有第一次执行getInstance时,才真正需要同步,其他时候都是对性能的损耗
public
class
Singletion2 {
private
static
Singletion2
uniqueInstance
;
private
Singletion2() {
}
// 每次都需要同步
public
static
synchronized
Singletion2 getInstance() {
if
(
uniqueInstance
==
null
) {
uniqueInstance
=
new
Singletion2();
}
return
uniqueInstance
;
}
}
----------
//使用“急切”创建实例(饿汉式),JVM会在线程方位这个静态变量之前,一定先创建这个实例,所以线程安全。
//缺点是不是在需要的时候才创建实例
public
class
Singletion3 {
private
static
Singletion3
uniqueInstance
=
new
Singletion3();
private
Singletion3() {
}
// 每次都需要同步
public
static
synchronized
Singletion3 getInstance() {
return
uniqueInstance
;
}
}
-------
//利用双重检查加锁,在getInstance方法中减少使用同步,用
public
class
Singletion4 {
private
static
Singletion4
uniqueInstance
;
private
Singletion4() {
}
// 每次都需要同步
public
static
synchronized
Singletion4 getInstance() {
if
(
uniqueInstance
==
null
) {
uniqueInstance
=
new
Singletion4();
}
return
uniqueInstance
;
}
}