设计模式之单例模式
单例模式
采用一定的方法保证在整个软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其
对象实例的方法(静态)
饿汉式(静态变量) 可能造成内存浪费
优点: 比较简单,在类装载的时候就完成了实例化,避免了线程同步的问题
缺点: 在类装载的时候就完成了实例化 没有达到 lazy loading(懒加载)的效果。如果从始至终
未使用这个实例,会造成内存的浪费
public class singleton{
//构造器私有化
private singleton(){
}
//本类内部创建实例对象
private final static singleton instance=new singleton();
//提供一个共有的静态方法返回对象实例
public static singleton getInstance(){
return instance;
}
}
饿汉式(静态代码块)
public class singleton{
//构造器私有化
private singleton(){
}
private static singleton instance;
static {
instance=new singleton();
}
public static singleton getInstance(){
return instance;
}
}
懒汉式 (线程不安全)
起到了懒加载的作用 但只能在单线程下使用
如果在多线程下一个线程进入了if判断还未来得及往下执行,拎一个线程也通过
了if判断这时便会产生多个实例 ( 不推荐使用)
public class singleton{
private static singleton instance;
privaet singleton(){}
public static singleton getInstance(){
if(instance==null){
instance=new singleton();
}
return instance;
}
}
懒汉式(线程安全) 加了synchroized 关键字
效率太低 每个线程想获得类的实例时候,执行getinstance()方法都要进行同步
public class singleton{
private static singleton instance;
privaet singleton(){}
public static synchroized singleton getInstance(){
if(instance==null){
instance=new singleton();
}
return instance;
}
}
如果加上同步代码块 连线程安全都无法保证 多个线程进入if判断
public class singleton{
private static singleton instance;
privaet singleton(){}
public static synchroized singleton getInstance(){
if(instance==null){
synchronized(singleton.class){
instance=new singleton();
}
}
}
}
双重检查 (推荐使用)
线程安全,延迟加载,效率较高
进行了两次if判断,保证了线程安全
这样实例化代码只用执行一次,后面再次访问时,直接return实例化对象,避免反复进行方法同步
class singleton{
private static volatile singleton instance;
private singleton(){
}
public static Singleton getInstance(){
if(instance== null){
synchronized(Singleton.class){
if(instance== nul){
singleton = new Singleton();
}
}
}
return singleton;
}
}
静态内部类(推荐使用)
public class singleton{
private singleton(){
}
//在singleton进行类装载的时候不会马上执行,从而保证了懒加载
private static class SingletonInstance{
private static final singleton INSTANCE=new singleton();
}
public static singleton getInstance(){
//装载静态内部类 补充:在jvm装载类的时候是线程安全的
return SingletonInstance.INSTANCE;
}
}