单例模式主要有两种
懒汉式
饿汉式
//基于懒汉式设计的一个单例模式,线程并不安全
public class Singleton {
private staitc Singleton uniqueInstance = null;
private Singleton() { }
public static Singleton getInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
//如果需要线程安全就要加上同步锁,不过这种写法导致每一次都要进行同步,消耗资源
public class Singleton {
private staitc Singleton uniqueInstance = null;
private Singleton() { }
synchronized public static Singleton getInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
//有一种方式叫双重加锁检查方式,不过这种方式需要使用一个关键字
public class Singleton {
private volatile staitc Singleton uniqueInstance = null;
private Singleton() { }
public static Singleton getInstance() {
synchronized(Singleton.class) {
if (uniqueInstance == null) {
synchronized(Singletion.class) {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
}
//下面介绍一下饿汉式的写法,这种方式本身就是线程安全的
public class Singleton {
private static Singleton uniqueInstance = new Singleton();
private Singleton() { }
public static Singleton getInstance() {
return uniqueInstance;
}
}
下面谈一谈个人对这两种方式的理解
懒汉式就是一种延迟加载的意思,需要时被加载,配上缓存池使用效果就更加了,但是线程安全比较繁琐
饿汉式本身是线程安全的,在应用启动时被加载
如何选择呢?如果是系统资源,并且是配置化资源,最好在应用启动时就加载,这样应用可能启动会比较慢,但是,一旦启动就不会再影响性能了,而对应按需加载的则使用懒汉式,并配合缓存池进行设计
原文:http://www.cnblogs.com/zhaojunyang/p/5031233.html