简单总结单例模式的4种写法
更新时间:2021年06月08日 14:39:43 作者:自&如
今天带大家学习java的相关知识,文章围绕着单例模式的4种写法展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
一、单例模式
属于创建者模式的一种, 单例模式的目的是使该类只有一个实例,同一个类的不同对象有不同的hashCode()
单例模式是由该类自行创建唯一个向外暴露的全局的对象
二、写法
- 饿汉式:无线程安全,但是类以加载就会创建实例,浪费资源
- 懒汉式:存在线程安全,需要加synchroined
- 内部类:无线程安全(完美方案)
- 枚举: 线程安全,听说是高效java推荐的写法
三、饿汉式
/**
* 饿汉式:
* 不适用new创建对象而是使用静态的getInstance()方法创建对象
* jvm保证线程安全
*/
public class SingleTest{
public static void main(String[] args) {
Single single1 = Single.getInstance();
Single single2 = Single.getInstance();
System.out.println(single1.hashCode());
System.out.println(single2.hashCode());
System.out.println(single1 == single2);
}
}
class Single {
final static Single INSTANCE = new Single();
public static Single getInstance(){return INSTANCE;}
}

四、懒汉式
//懒汉式的线程安全的写法又称为双检索懒汉模式
public class SingleTest {
public static void main(String[] args) {
for(int i = 0;i < 10; i++){
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Single.getInstance().hashCode());
}
}).start();
}
}
}
class Single{
private static Single instance = null;
Single(){}
public static Single getInstance(){
if (instance == null){
synchronized (Single.class) {
if(instance == null){
try{
Thread.sleep(1);
}catch (Exception e){
e.printStackTrace();
}
instance = new Single();
}
}
}
return instance;
}
}

五、内部类
/**
* 静态内部类:完美写法
*/
public class SingleTest {
public static void main(String[] args) {
Single single1 = Single.getInstance();
Single single2 = Single.getInstance();
System.out.println(single1.hashCode());
System.out.println(single2.hashCode());
System.out.println(single1 == single2);
}
}
class Single{
private static Single instance;
public static Single getInstance(){
return InnerSingle.INSTANCE;
}
private static class InnerSingle{
private final static Single INSTANCE = new Single();
}
}

六、枚举
//枚举:完美写法
public class SingleTest {
public static void main(String[] args) {
Single single1 = Single.INSTANCE;
Single single2 = Single.INSTANCE;
System.out.println(single1.hashCode());
System.out.println(single2.hashCode());
System.out.println(single1 == single2);
}
}
enum Single{
INSTANCE;
}

七、结论
优点:
- 单例模式可以保证内存里只有一个实例,减少了内存的开销。
- 避免对资源的多重占用
- 单例模式设置全局访问点,可以优化和共享资源的访问。
缺点:
- 没有接口,扩展不了代码,违背了开闭原则
- 单例模式的功能代码通常写在一个类中,如果功能设计不合理,则很容易违背单一职责原则。
到此这篇关于简单总结单例模式的4种写法的文章就介绍到这了,更多相关单例模式的4种写法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
java基于QuartzJobBean实现定时功能的示例代码
QuartzJobBean是Quartz框架中的一个抽象类,用于定义和实现可由Quartz调度的作业,本文主要介绍了java基于QuartzJobBean实现定时功能的示例代码,具有一定的参考价值,感兴趣可以了解一下2023-09-09
Java、C++中子类对父类函数覆盖的可访问性缩小的区别介绍
这篇文章主要给大家介绍了关于Java、C++中子类对父类函数覆盖的可访问性缩小的区别的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。2018-01-01
spring boot搭建文件服务器解决同时上传多个图片和下载的问题
这篇文章主要介绍了spring boot搭建文件服务器解决同时上传多个图片和下载的问题,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下2019-11-11
javax.validation.constraints注解使用
这篇文章主要介绍了javax.validation.constraints注解使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2024-07-07
Spring MVC+FastJson+hibernate-validator整合的完整实例教程
这篇文章主要给大家介绍了关于Spring MVC+FastJson+hibernate-validator整合的完整实例教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。2018-04-04


最新评论