1.名词解释。
单例,顾名思义就是在整个程序中只有一个对象。所有能实现这一目的的方法都是单例模式。
2.具体实现。
(1)构造方法私有,确保外部类中不能new对象。
(2)提供方法供外部调用。返回对象。
3.多种单例的实现及优缺点比较
(1)饿汉式实现。
public class Singleton {
//静态成员变量 程序加载时就会创建对象
private static Singleton mInstance=new Singleton();
//构造方法私有
private Singleton(){
}
//公开方法,供外部调用获取对象
public static Singleton getInstance() {
return mInstance;
}
}
缺点:程序加载就创建对象,会增加不必要的内存开销。
(2)懒汉式实现。
public class Singleton {
//静态成员变量
private static Singleton mInstance;
//构造方法私有
private Singleton(){
}
//公开方法,返回对象
public static Singleton getInstance() {
if(mInstance==null){
mInstance=new Singleton();
}
return mInstance;
}
}
与饿汉式差异:将创建对象操作移到公开方法中,判断对象为空则创建,不为空直接返回。
缺点:多线程操作时,不能确保单例。
(3)同步方法实现
public class Singleton {
//静态成员变量
private static SingletonmInstance;
//构造方法私有
private Singleton(){
}
//公开方法,返回对象,增加synchronized关键字,
public static synchronized Singleton getInstance() {
if(mInstance==null){
mInstance=new Singleton();
}
return mInstance;
}
}
缺点:效率不高。
(4)同步锁加双重检查
public class Singleton {
//静态成员变量
private static SingletonmInstance;
//构造方法私有
private Singleton(){
}
//公开方法,返回对象
public static Singleton getInstance() {
if(mInstance==null){
synchronized (Singleton.class){
if(mInstance==null){
mInstance=new Singleton();
}
}
}
return mInstance;
}
}
(5)加volatile关键字 (完美单例)
作用:1.防止重排序。2.线程可见性。
public class Singleton {
//静态成员变量
private static volatile Singleton mInstance;
//构造方法私有
private Singleton(){
}
//公开方法,返回对象
public static Singleton getInstance() {
if(mInstance==null){
synchronized (Singleton.class){
if(mInstance==null){
mInstance=new Singleton();
}
}
}
return mInstance;
}
}