1、作用:
只产生单一实例对象。
举例来说:就是为了只产生单一系列的产品。如冰箱类,此时单例是只产生某种具体型号类型的冰箱。
2、单例模式的两种方式
1.懒汉模式
1.1线程安全的懒汉模式
public class Singleton{
private static Singleton instance; //权限须为私有。此时只有一个引用,并没有实例化
private Singleton() {//私有无参的构造函数
}
public static SingletongetInstance() {//静态的方法
if(instance==null){
//synchronized锁在方法执行前,不是加在方法上,所以此时就不用每次执行获取实例方法的时候都锁住此方法,且在之后的获取过程中都不用执行锁住的代码,提高效率
synchronized("demo") {//同步,并发;引号内容任意或
synchronized(Singleton.class)
instance=new Singleton();
return instance;
}
}else{
return instance;
}
}
}
特点:当只有第一次使用的时候才实例化,加载类的速度快,但是获取对象的速度慢;需要考虑线程并发
1.2线程不安全的懒汉模式
public class Singleton{
private static Singleton instance; //权限须为私有。此时只有一个引用,并没有实例化
private Singleton() {//私有无参的构造函数
}
public static SingletongetInstance() {//静态的方法
if(instance==null){
instance=new Singleton();//当有多个线程都执行在此处时,就会执行多次
return instance;
//当
有多个线程都
执行
在此处时,就会执行多次
}else{
return instance;
}
}
}
特点:当只有第一次使用的时候才实例化,加载类的速度快,但是获取对象的速度慢;
2.饿汉模式
public class Singleton{
private static Singleton instance = new Singleton(); //实例化一个对象
private Singleton(){//私有无参的构造函数
}
public static SingletongetInstance(){
return instance;
}
}
特点:
加载类的速度慢,但是获取对象的速度快;不需要考虑线程并发
不用的时候占用内存