JAVA的单例,继承和重写

什么是单例

单例对象的类必须保证只有一个实例存在----这是维基百科上对单例的定义,这也可以作为对意图实现单例模式的代码进行检验的标准。

单例分为两大类
1.懒汉式:指全局的单例实例在第一次被使用时构建。
2.饿汉式:指全局的单例实例在类装载时构建。
平常我们使用较多的是懒汉式的单例

下面详细介绍一下两者的区别
1.懒汉式:
最简单的写法
//代码1

public class Single1 {
   
    private static Single1 instance;
    public static Single1 getInstance() {
   
        if (instance == null) {
   
            instance = new Single1();
        }
        return instance;
    }
}
//代码1.1
public class Single1 {
   
    private static Single1 instance;
    //将构造方法变成私有的
    private Single1() {
   }
    public static Single1 getInstance() {
   
    //判断是否已有实例对象
        if (instance == null) {
   
            instance = new Single1();
        }
        return instance;
    }
}

这种方法在大多数情况下是没有问题的,但是,当进行多线撑工作时,如果同时运行到if(instance==null),都判断为空的情况下,就会同时创建凉的线程的示例,就不属于单例了。

synchronized版本

synchronized版本
为了修改上面的问题,我们添加一个同步锁,修改代码如下:

//代码2

public class Single2 {
   
    private static Single2 instance;
    private Single2() {
   }
    public static synchronized Single2 getInstance() {
   
        if (instance == null) {
   
            instance = new Single2();
        }
        return instance;
    }
}

我们在原来的基础上添加了一个synchronized关键字以后,getInstance方法就会锁上了,如果遇到了两个线程同时执行这个方法,就会有一个获得同步锁先执行方法,另一个则需要等大,第一个执行完之后,才会执行第二个。这样做就避免了可能出现因为多线程导致多个实例的情况。
但是这种方法也有一个问题:给gitInstance方法加锁,虽然会避免了可能会出现的多个实例问题,但是会强制除T1之外的所有线程等待,实际上会对程序的执行效率造成负面影响。

双重检查(Double-Check)版本

代码2相对于代码1的效率问题,其实是为了解决1%几率的问题,而使用了一个100%出现的防护盾。那有一个优化的思路,就是把100%出现的防护盾,也改为1%的几率出现,使之只出现在可能会导致多个实例出现的地方。
———我们使用下面的方法,来解决这个问题:

//代码3

public class Single3 {
   
    private static Single3 instance;
    private Single3() {
   }
    public static Single3 getInstance() {
   
        if (instance == null) {
   
            synchronized (Single3.class) {
   
                if (instance == null) {
   
                    instance = new Single3();
                }
            }
        }
        return instance;
    }
}

这个方法相对来说比较复杂,其中出现了两次if(instancenull)的、判断,这个叫双重检查==

第一个if(instance==null)是为了解决代码2中的效率问题,只有instance为null的时候,才进入synchronized的代码块,大大的减少了机滤

第二个if(instance==null) ,是为了防止出现多个实例的情况。

为了是我们的代码看起来更加完美,我们又进行了一些处理,终极版本的代

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值