首页 > 应用开发 > Java > Java 设计模式——单例模式 理论代码相结合
单例模式,属于创建类型的一种常用的软件设计模式。通过单例模式的方法创建的类在当前进程中只有一个实例(根据需要,也有可能一个线程中属于单例,如:仅线程上下文内使用同一个实例)--来自百度百科
单例模式可以让我们只创建一个对象从而避免了频繁创建对象导致的内存消耗和垃圾回收。
单例模式只允许创建一个对象,因此节省内存,加快对象访问速度,因此对象需要被公用的场合适合使用,如多个模块使用同一个数据源连接对象等等。如:
项目中的具体应用:
单例模式有八种方式:
代码实现:
结论及优缺:
优点:饿汉式(静态常量方式)它不用担心线程安全问题,它本身就是在类的装载的时候完成实例化的。
注意:你可能会想类都已经加载了,为什么我还会不用到呢?
在单例模式中大都调用getInstance方法,getInstance这个静态方法可以让类加载,那么同样的道理,如果这个类中还有其他的静态方法,你调用它的时候,同样会使类进行装载。
结论:这种方式其实和第一种非常类似,只是将类的实例化过程放进静态代码块而已。优缺点同饿汉式(静态常量)。
结论及优缺:
if(singleton==null)下,但还未来的及执行,第二个线程就紧随而来也进入了
if(singleton==null)下,那么就会创建多个实例。就不是单例模式了。结论及优缺:
Singleton getInstance() 上多了一个了
synchronized,将这个方法变成了同步方法,解决了线程同步问题。synchronized 关键字,导致执行效率的降低。并且之后每次来获取,都要进行同步,但其实本质上这段代码执行一次,之后都是retrun 是最佳的,而方法进行同步就大大降低效率拉。结论及优缺:
1)其实本意是对上一种方式做一个优化,想要提高同步效率,改为这种同步代码块的方式
2)但实际上,这并不能起到线程同步的作用,跟上一种方式遇到的问题是一样的。
3)同样不建议采取这种方式来实现单例模式。
结论及优缺:
1)我们在代码中进行了两次
if (singleton == null)操作,一次在同步代码块外,一次在同步代码块内,两次检查,保证了线程的安全。
2)这样的话,同步代码只要执行一次,singleton也只需实例化一次,既做到了懒加载,又同时保证线程安全,提高了执行效率。
3)结论:懒加载、线程安全、效率较高,当然用这种方式啊。
结论及优缺:
1)这种方式同样不会产生线程同步问题,也是借用JVM的类装载的机制来保证实例化的时候只有一个线程。
2)静态内部类
SingletonInstance在
Singleton被装载时,并不会立即实例化,而是在需要实例化的时候,调用了getInstance 方法,才会进行
SingletonInstance类的装载。
3)类的静态属性只会在第一次加载类的时候进行初始化,而在这里,JVM的类装载机制帮助我们保证了线程安全性。
4)小结:避免了线程安全问题、利用了静态内部类延迟加载(做到懒加载)、效率高,这不更爽了吗,用起来。
结论及优缺:
注:一般来说,大都采用饿汉式,并竟方便,如果十分在意资源的话,一般采用静态内部类。但是一切的使用,都是具体问题具体分析,没有最好的,只有最适合的。
像JDK中的 Runtime就是使用了饿汉式单例方式实现
Mybatis中
ErrorContext为
ThreadLocal基于线程唯一
Spring中也有蛮多哈,没有一一去找了。
一直想整理出一份完美的面试宝典,但是时间上一直腾不开,这套 一千多道面试题宝典,结合今年金三银四各种大厂面试题,以及 GitHub 上 star 数超 30K+ 的文档整理出来的,我上传以后,毫无意外的短短半个小时点赞量就达到了 13k,说实话还是有点不可思议的。
内容涵盖:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、SpringBoot、SpringCloud、RabbitMQ、Kafka、Linux等技术栈(485页)
内容涵盖:Java基础、JVM、高并发、多线程、分布式、设计模式、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat、数据库、云计算等
由于篇幅限制,详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!
需要的小伙伴,可以一键三连, 点击这里获取免费领取方式!
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70000428/viewspace-2785742/ ,如需转载,请注明出处,否则将追究法律责任。