单例模式主要分两种:饿汉模式和懒汉模式。
饿汉模式例子:
懒汉模式例子:
饿汉模式和懒汉模式的区别在于单例加载的时间不同,对于饿汉模式来说,线程是安全的,对于懒汉模式,则是不安全的。
为了实现线程安全,可以再懒汉模式的getInstance加上同步约束synchronized.但是如果这样的话,每次取一个实例都需要进去同步机制,那并发线程多的时候,速度显然收影响。
所以有个双检测锁机制的懒汉模式。
双检测锁机制的懒汉模式例子:
饿汉模式例子:
public class HungrySingle {
private static HungrySingle single = new HungrySingle();
private HungrySingle() {
}
public static HungrySingle getInstance() {
return single ;
}
public static void main(String[] args) {
HungrySingle single = getInstance ();
}
}
懒汉模式例子:
public class LazySingle {
public static LazySingle single = null;
private LazySingle() {
}
public static LazySingle getInstance() {
if (single == null) {
single = new LazySingle();
}
return single ;
}
public static void main(String[] args) {
LazySingle single = getInstance ();
}
}
饿汉模式和懒汉模式的区别在于单例加载的时间不同,对于饿汉模式来说,线程是安全的,对于懒汉模式,则是不安全的。
为了实现线程安全,可以再懒汉模式的getInstance加上同步约束synchronized.但是如果这样的话,每次取一个实例都需要进去同步机制,那并发线程多的时候,速度显然收影响。
所以有个双检测锁机制的懒汉模式。
双检测锁机制的懒汉模式例子:
public class DoubleLockLazySingle {
public static DoubleLockLazySingle single = null;
private DoubleLockLazySingle () {
}
public static DoubleLockLazySingle getInstance() {
if (single == null) {
synchronized(DoubleLockLazySingle.class) {
if (single == null) {
single = new DoubleLockLazySingle();
}
}
}
return single;
}
public static void main(String[] args) {
DoubleLockLazySingle single = getInstance ();
}
}
双检测锁机制可以实现lazey loading,又可以实现线程同步,应该算是比较好的单例模式。
单例模式应用在log4j,数据库连接池等。