<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">什么情况下使用:整个软件系统中此类的实例只有一份</span>
1、windows 的任务管理器(单实例) 2、字符串池,常量池,
构造方法使用private修饰,因此无法new对象
设计思想:外部可以通过静态方法访问实例
优点:多个类共享一个实例
常用单例实现:
懒汉模式:优点:对象是何时需要何时创建,减少内存消耗
缺点:需要考虑线程安全,效率会比较低
何时用懒汉:大对象,稀少用
<span style="font-family: Arial, Helvetica, sans-serif;">public class SingletonClass{</span>
private static SingletonClass instance=null;
public static SingletonClass getInstance(){
if(instance==null){
synchronized(SingletonClass.class){
if(instance==null){
instance=new SingletonClass();
}
}
}
return instance;
}
private SingletonClass(){}
}
多线程懒汉模式适用:
class Singleton01{//懒汉式单例
private Singleton01(){}
private static Singleton01 instance;
/**外界通过此方法获得对象*/
public synchronized static Singleton01 getInstance(){ //synchronized很费资源,所以synchronized方法不是很优
if(instance==null){
instance=new Singleton01();
}
return instance;
}//多个线程访问此方法时有问题吗? 不会
//会获得多个对象吗? 不会
}
因为synchronized耗资源,效率底
//改进
//类加载时无需构建对象
//需要对象时还要有对象,而且不需要考虑线程安全
class Singleton03{//懒汉单例变种称 饿汉模式 优点:无需考虑线程安全,效率比较高 缺点:类加载时创建对象,对象比较大就会占内存。何时用:小对象,经常用
private Singleton03(){}
private static class Inner01{
static Singleton03 instance=
new Singleton03();
}
//需要时创建对象,无需考虑线程安全
public static Singleton03 getInstance(){
return Inner01.instance;
}
}
这样直接new Singleton03感觉有些粗暴,无空判断,项目加载了就new了对象
继续改进
双重锁的形式
public static class Singleton{
private static Singleton instance=null;
private Singleton(){
//do something
}
public static Singleton getInstance(){
if(instance==null){
synchronized(Singleton.class){
if(null==instance){
instance=new Singleton();
}
}
}
return instance;
}
}