- 概述
- 饿汉式
- 懒汉式
- 静态内部类
- jdk案例
1)什么是单例?
某类需要负责创建自己的对象并确保只有单个对象被创建,并提供了一种访问此对象的方式。
2)单例设计模式分类两种:
- 饿汉式:类加载就会创建该单实例对象
- 懒汉式:首次使用该对象时才会创建
- 私有构造器,私有当前对象并初始化(或在静态代码块进行初始化)
- 公共静态的访问此对象的方法
- 典型案例是枚举
//饿汉式
class singleton1 {
private static singleton1 obj=new singleton1();
private singleton1(){}
public static singleton1 getObj(){
return obj;
}
}
//枚举
enum singleton2{
obj;
}
懒汉式
- 私有构造器,私有当前对象的声明并使用volitile修饰
- 公共静态的访问此对象的方法
- 确保线程安全
- 在方法上添加synchronized,在方法中进行null判断是否是第一次创建对象
- 在方法体中进行synchronized和双重检查是否为null来确保线程安全
//方式一
class Singleton3 {
private static volatile Singleton3 obj;
private Singleton3(){}
public static Singleton3 etObj(){
//1.如果obj不为null,不需要进行锁 *** 作来影响性能
if(obj==null){
obj=new Singleton3();
}
return obj;
}
}
//方式二
class singleton4 {
private static volatile singleton4 obj;
private singleton4(){}
public static synchronized singleton4 getObj(){
//1.如果obj不为null,不需要进行锁 *** 作来影响性能
if(obj==null){
synchronized (singleton4.class){
//2.另一线程在此处进行了等待,但是一旦获取到后,又会进行重复创建,需要再次判断null
if(obj==null){
obj=new singleton4();
}
}
obj=new singleton4();
}
return obj;
}
}
静态内部类
- 私有构造器
- 私有的静态内部类,内部类中饿汉式声明外部类对象
- 公共静态的访问此对象的方法,返回内部类的成员变量
class singleton5{
private singleton5(){}
private static class singleton5Holder{
private static final singleton5 obj=new singleton5();
}
public static singleton5 getObj(){
return singleton5Holder.obj;
}
}
更优秀的方案,结合了饿汉式与懒汉式,静态内部类并不会因为外部类加载而加载,只会在被使用时才会初始化单例对象
jdk案例Runtime类
public class Runtime {
private static Runtime currentRuntime = new Runtime();
public static Runtime getRuntime() {
return currentRuntime;
}
private Runtime() {}
....
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)