单例模式
单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例(一个类在java虚拟机中只有一个对象,并提供一个全局访问点)。
适用范围:如数据库的链接对象、属性配置文件的读取对象、线程池、缓存、日志对象等等。
模式结构:分别为饿汉式和懒汉式(如果考虑性能问题的话,就使用懒汉式,),构造器私有化,对外提供方法如同步关键字。
饿汉式(立即加载方式):
public class HurgrySingleton {
private static HurgrySingleton hurgry=new HurgrySingleton();
private HurgrySingleton(){};
public static HurgrySingleton getSinletonHurgry(){
return hurgry;
}
}
饿汉式单例在类加载初始化时就创建好一个静态的对象供外部使用,除非系统重启,这个对象不会改变,所以本身就是线程安全的。
懒汉式代码(延迟加载方式):
1,普通懒汉式单例
public class LarzySingleton {
private static LarzySingleton larzy=null;
private LarzySingleton(){};
public static LarzySingleton getSinletonLarzy(){
if(larzy==null){
larzy=new LarzySingleton();
}
return larzy;
}
}
这种方式虽然使用懒加载的方式实现了懒汉式单例,但是由于不是线程安全的,所以在多线程的环境下会产生多个实例对象。
2,使用多线程同步锁
public class LarzySingleton {
private static LarzySingleton larzy=null;
private LarzySingleton(){};
public static LarzySingleton getSinletonLarzy(){
synchronized(LarzySingleton.class){
if(larzy==null){
larzy=new LarzySingleton();
}
}
return larzy;
}
}
这种在方法上加同步锁或是在同步代码块中加同步锁,虽然解决了多个实例对象的
为题,但是它的运行效率却很低下。
3,进一步优化
public class LarzySingleton {
private static LarzySingleton larzy=null;
private LarzySingleton(){};
public static LarzySingleton getSinletonLarzy(){
if(larzy==null){
synchronized(LarzySingleton。class){
if(larzy==null){
larzy=new LarzySingleton();
}
}
}
return larzy;
}
}
使用这种双重检查进行进一步优化,可以避免整个方法被锁,只对需要锁的代码部分加锁,
可以提高执行的效率。