单例设计模式
SingleInstance
应用场景:虚拟机对象!任务管理器对象!
实现方式:
饿汉式:对象提前就做好了,等着来取。
懒汉式:获取对象时没有才创建。
饿汉式实现步骤:
- 定义一个单例类
- 构造器私有化
- 定义一个静态成员变量存储对象
- 提供方法getInstance获取对象
public class Singleton{
//定义一个静态变量存储一个对象,在用类获取对象的时候,对象已经提前创建好了。
private static final Singleton INSTANCE = new Singleton();
//构造器私有。
private Singleton(){
}
//返回单例对象的方法。
public static Singleton getInstance(){
return INSTANCE;
}
}
懒汉式实现步骤:
- 定义一个单例类
- 构造器私有化
- 定义一个静态成员变量存储对象
- 提供方法getInstance获取对象,判断对象有没有,没有则创建
public class Singleton{
//定义一个静态变量存储对象
private static Singleton instance;
//构造器私有。
private Singleton(){
}
//返回单例对象的方法。
public static Singleton getInstance(){
if(instance == null){
// 判断对象是否存在,不存在则新建
instance = new Singleton();
}
return instance;
}
}
思考:上边的懒汉模式是否有问题?
instance = new Singleton();是非原子操作,如果在多线程的环境下,可能会发生还未生成对象即被引用,出现对象返回null。终极代码:为变量添加volatile关键字,保证其可见性,新建对象加锁,保证原子性。
public class Singleton{
//定义一个静态变量存储对象
private static volatile Singleton instance;
//构造器私有。
private Singleton(){
}
//返回单例对象的方法。
public static Singleton getInstance(){
if(instance == null){
synchronized (){
// 判断对象是否存在,不存在则新建
instance = new Singleton();
}
}
return instance;
}
}