单例模式
2018-03-26 本文已影响0人
Charein
确保类只有一个实例,并且提供一个全局访问点。
下面看一个最简单的单例代码:
public class Single {
private static Single INSTANCE;
private Single() {
}
public static Single getInstance() {
if (INSTANCE == null) {
INSTANCE = new Single();
}
return INSTANCE;
}
}
上面的代码在多线程下会出现问题,如果要考虑多线程,可以使用sychronized同步方法
,如:
public class Single {
private static Single INSTANCE;
private Single() {
}
public synchronized static Single getInstance() {
if (INSTANCE == null) {
INSTANCE = new Single();
}
return INSTANCE;
}
}
如果仔细分析,可知每次调用getInstance()方法都会被阻塞(不论INSTANCE是否已经实例化,其实被实例化之后不需要再进行同步),这时可采用同步代码块的方式,如:
public class Single {
private static Single INSTANCE;
private Single() {
}
public static Single getInstance() {
if (INSTANCE == null) {
synchronized (Single.class) {
if (INSTANCE == null) {
INSTANCE = new Single();
}
}
}
return INSTANCE;
}
}
上述的方式都是通过延时实例化,如果不考虑提前创建的负担,可以使用这种方式(它保证了线程安全)
public class Single {
private static Single INSTANCE = new Single();
private Single() {
}
public static Single getInstance() {
return INSTANCE;
}
}