单例模式的优缺点和使用场景

单例模式(Singleton),也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理

1.饿汉式:单例实例在类装载时就构建,急切初始化。(预先加载法)

 1 /**
 2 * 饿汉式(推荐)
 3 *
 4 */
 5 public class Test {
 6         private Test() {
 7         }
 8         public static Test instance = new Test();
 9         public Test getInstance() {
10                 return instance;
11         }
12 }

优点

1.线程安全
2.在类加载的同时已经创建好一个静态对象,调用时反应速度快

缺点

资源效率不高,可能getInstance()永远不会执行到,但执行该类的其他静态方法或者加载了该类(class.forName),那么这个实例仍然初始化

2.懒汉式:单例实例在第一次被使用时构建,延迟初始化。

 1 class Test {
 2         private Test() {
 3         }
 4         public static Test instance = null;
 5         public static Test getInstance() {
 6                 if (instance == null) {
 7               //多个线程判断instance都为null时,在执行new操作时多线程会出现重复情况
 8                         instance = new Singleton2();
 9                 }
10                 return instance;
11         }
12 }

优点:
避免了饿汉式的那种在没有用到的情况下创建事例,资源利用率高,不执行getInstance()就不会被实例,可以执行该类的其他静态方法。
缺点:
懒汉式在单个线程中没有问题,但多个线程同事访问的时候就可能同事创建多个实例,而且这多个实例不是同一个对象,虽然后面创建的实例会覆盖先创建的实例,但是还是会存在拿到不同对象的情况。解决这个问题的办法就是加锁synchonized,第一次加载时不够快,多线程使用不必要的同步开销大。

3.双重检测

class Test {
 2         private Test() {
 3         }
 4         public static Test instance = null;
 5 
 6         public static Test getInstance() {
 7                 if (instance == null) {
 8                         synchronized (Test.class) {
 9                                 if (instance == null) {
10                                         instance = new Test();
11                                 }
12                         }
13                 }
14                 return instance;
15         }
16 }

优点
资源利用率高,不执行getInstance()就不被实例,可以执行该类其他静态方法
缺点
第一次加载时反应不快,由于java内存模型一些原因偶尔失败

4.静态内部类

1 class Test {
 2         private Test() {
 3         }
 4 
 5         private static class SingletonHelp {
 6                 static Test instance = new Test();
 7         }
 8 
 9         public static Test getInstance() {
10                 return SingletonHelp.instance;
11         }
12 }

优点
资源利用率高,不执行getInstance()不被实例,可以执行该类其他静态方法
缺点
第一次加载时反应不够快

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值