Java单例创建方式有哪些
本文小编为大家详细介绍“Java单例创建方式有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java单例创建方式有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
定义单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)
使用场景对于一些需要频繁创建销毁的对象
重量级的对象
经常使用到的对象
工具类对象
数据源
session
单例模式八种方式饿汉式(静态常量)代码
/***饿汉式(静态常量)*优势:简单,避免多线程的同步问题*劣势:无懒加载,内存浪费*@author:liyajie*@createTime:2022/2/1015:50*@version:1.0*/publicclassSingleton1{//私有化构造方法privateSingleton1(){}//静态常量privatestaticfinalSingleton1singleton1=newSingleton1();//对外提供公共方法publicstaticSingleton1getSingleton1(){returnsingleton1;}}
分析
优势:简单,避免多线程的同步问题
劣势:无懒加载,内存浪费
饿汉式(静态代码块)代码
/***饿汉式(静态代码块)*优势:简单,避免多线程的同步问题*劣势:无懒加载,内存浪费*@author:liyajie*@createTime:2022/2/1015:50*@version:1.0*/publicclassSingleton2{//私有化构造方法privateSingleton2(){}privatestaticfinalSingleton2singleton2;//静态代码块static{singleton2=newSingleton2();}//对外提供公共方法publicstaticSingleton2getSingleton2(){returnsingleton2;}}
分析
优势:简单,避免多线程的同步问题
劣势:无懒加载,内存浪费
懒汉式(线程不安全)代码
/***懒汉式(线程不安全)*@author:liyajie*@createTime:2022/2/1015:50*@version:1.0*/publicclassSingleton3{//私有化构造方法privateSingleton3(){}//内部属性privatestaticSingleton3singleton3;//对外提供公共方法publicstaticSingleton3getSingletons(){if(singleton3==null){singleton3=newSingleton3();}returnsingleton3;}}
分析
优势:起到了懒加载的效果 不会造成内存浪费
劣势:线程不安全 不推荐这种方式的
懒汉式(同步方法)代码
/***懒汉式(同步方法)*优势:解决了线程同步问题*劣势:使用synchronized同步关键字,性能太低*@author:liyajie*@createTime:2022/2/1015:50*@version:1.0*/publicclassSingleton4{//私有化构造方法privateSingleton4(){}//内部属性privatestaticSingleton4singleton4;//对外提供公共方法publicstaticsynchronizedSingleton4getSingleton4(){if(singleton4==null){singleton4=newSingleton4();}returnsingleton4;}}
分析
优势:解决了线程安全问题,
劣势:效率太低
懒汉式(同步代码块)代码
/***懒汉式(同步代码块)*@author:liyajie*@createTime:2022/2/1015:50*@version:1.0*/publicclassSingleton5{//私有化构造方法privateSingleton5(){}//内部属性privatestaticSingleton5singleton5;//对外提供公共方法publicstaticSingleton5getSingleton5(){if(singleton5==null){synchronized(Singleton5.class){singleton5=newSingleton5();}}returnsingleton5;}}
分析
优势:起到了懒加载的效果 不会造成内存浪费
劣势:线程不安全 不推荐这种方式的
双重检查锁方式代码
/***双重检查锁机制*@author:liyajie*@createTime:2022/2/1015:50*@version:1.0*/publicclassSingleton6{//私有化构造方法privateSingleton6(){}//内部属性privatevolatilestaticSingleton6singleton6;//对外提供公共方法publicstaticSingleton6getSingleton6(){if(singleton6==null){synchronized(Singleton6.class){if(singleton6==null){singleton6=newSingleton6();}}}returnsingleton6;}}
分析
实现了懒加载,效率很高,解决了线程安全
静态内部类方式代码
/***静态内部类*@author:liyajie*@createTime:2022/2/1015:50*@version:1.0*/publicclassSingleton7{//私有化构造方法privateSingleton7(){}//内部类privatestaticclassSingleInstance{publicstaticfinalSingleton7singleton7=newSingleton7();}//对外提供公共方法publicstaticSingleton7getSingleton7(){returnSingleInstance.singleton7;}}
分析
不会出现线程安全问题 JVM来帮我们保证了线程的安全性
利用静态内部类的特点,效率也很高,
实际开发中推荐使用的
枚举方式代码
定义单例对象
/***@desc:*@author:liyajie*@createTime:2022/2/1110:25*@version:1.0*/publicclassSingleton{publicvoidhello(){System.out.println("hello");}}
定义枚举实例化单例对象
/***枚举方式*@author:liyajie*@createTime:2022/2/1015:50*@version:1.0*/enumSingleton8{//相当于publicstaticfinalSingleton8INSTANCE;//保证了枚举实例只能被实例化一次INSTANCE;//定义单例变量privateSingletonsingleton;//枚举构造方法,该构造方法是private,执行构造方法的时候,同时创建我们的单例对象Singleton8(){singleton=newSingleton();}//对外提供公共方法publicSingletongetSingleton(){returnsingleton;}}
使用方法Singleton8.INSTANCE.getSingleton()即可获取我们的单例对象了
分析
简单,避免了线程安全问题
实际开发中推荐使用的
读到这里,这篇“Java单例创建方式有哪些”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。