正文
()
{
return
instance;
}
}
对于饿汉模式来说,这种写法已经很‘perfect’了,唯一的缺点就是,由于instance的初始化是在类加载时进行的,类加载是由ClassLoader来实现的,如果初始化太早,就会造成资源浪费。
当然,如果所需的单例占用的资源很少,并且也不依赖于其他数据,那么这种实现方式也是很好的。
类装载的时机:
-
new一个对象时
-
使用反射创建它的实例时
-
子类被加载时,如果父类还没有加载,就先加载父类
-
JVM启动时执行主类 会先被加载
懒汉模式
懒汉模式的代码如下
public
class
Singleton
{
private
static
Singleton instance =
null
;
private
Singleton
(
)
{
}
public
static
Singleton
getInstance
(
)
{
if
(instance ==
null
) {
instance =
new
Singleton();
}
return
instance;
}
}
每次获取instance之前先进行判断,如果instance为空就new一个出来,否则就直接返回已存在的instance。
这种写法在单线程的时候是没问题的。但是,当有多个线程一起工作的时候,如果有两个线程同时运行到 if (instance == null),都判断为null(第一个线程判断为空之后,并没有继续向下执行,当第二个线程判断的时候instance依然为空),最终两个线程就各自会创建一个实例出来。这样就破环了单例模式 实例的唯一性,要想保证实例的唯一性就需要使用synchronized,加上一个同步锁:
public
class
Singleton
{
private
static
Singleton instance =
null
;
private
Singleton
()
{}
public
static
Singleton
getInstance
()
{
synchronized
(Singleton.class){
if