定义:一个独立的可供全局访问的对象实例
1. 饿汉式:
public class Singleton{
private static Singleton singleton = new Singleton();
public Singleton(){
}
public static Singleton getInstance(){
return singleton;
}
}
PS:类第一次加载的时候就会完成对象实例的创建,对象获取比较快。但是如果此对象在整个应用程序都未使用,则就会造成资源的浪费。
2. 懒汉式:
public class Singleton{
private static Singleton singleton;
public Singleton(){
}
public static Singleton getInstance(){
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
PS:第一次调用的时候进行对象的创建,第一次获取对象相对比较慢。线程不安全,多个线程调用时会出错。
3.DCL:(有缺陷)
//一般传统的DCL,我们可能这么写
public class Singleton{
public static Singleton singleton;
private String mTextString;
private int number;
public Singleton(){
mTextString = "Singleton";
number = 20;
}
public static Singleton getInstance(){
if(singleton == null){
synchronized(Singleton.class){
if(singleton == null){
singleton = new Singleton();
}
}
}
return singleton;
}
}
PS:这种写法是有缺陷的,某种情况下可能会造成数据的丢失。
4.DCL:(正确写法)://确保singleton的访问是读在写之后
public class Singleton{
public volatile static Singleton singleton;
private String mTextString;
private int number;
public Singleton(){
mTextString = "Singleton";
number = 20;
}
public static Singleton getInstance(){
if(singleton == null){
synchronized(Singleton.class){
if(singleton == null){
singleton = new Singleton();
}
}
}
return singleton;
}
5. 静态内部类:(推荐使用)
//既可保证在Jvm的唯一性,又可以保证懒加载
public class Singleton{
private static Singleton singleton;
public Singleton(){
}
public static Singleton getInstance(){
return SingletonHolder.singleton;
}
public static class SingletonHolder{
private static final Singleton singleton = new Singleton();
}
}