单例模式:确保一个类只有一个实例,并提供一个全局访问点。当你需要实例时,向类查询,而不是自行new一个。
经典单例模式代码
public class Singleton{
private static Singleton singleton;
public static Singleton getInstance(){
if(singleton==null){
singleton=new Singleton();
}
return singleton;
}
}
上面单例模式的缺点,在多线程操作时很明显。
(1)采用了延迟实例化,下面是饥饿的实例化
public class Singleton{
private static Singleton singleton=new Singleton();
public static Singleton getInstance(){
return singleton;
}
}
(2)采用同步方法
public class Singleton{
private static Singleton singleton;
public static synchronized Singleton getInstance(){
if(singleton==null){
singleton=new Singleton();
}
return singleton;
}
}
(3)双重锁检查机制,在性能和安全之间的中和。
public class Singleton{
private volatile static Singleton singleton;
public static Singleton getInstance(){
if(singleton==null){
synchronized(Singleton.class){
if(singleton==null){
singleton=new Singleton();
}
}
}
return singleton;
}
}
小提示:类加载器可能有机会创建自己的单例。所以如果你的程序有多个类加载器又同时使用了单例模式,请自己指定类加载器。
本文深入探讨单例模式的实现方式,包括懒汉式、饿汉式、同步方法及双重检查锁定等,分析其在多线程环境下的优劣。

2397

被折叠的 条评论
为什么被折叠?



