单例模式中懒汉式和饿汉式的区别区别在哪?

一、单例模式Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。所谓单例就是在系统中只有一个该类的实例,或者说类只能被创建一次。

二、详解饿汉式、懒汉式

饿汉式

1.创建一个类 然后对类里面的构造器进行私有化  目的:防止外面调用该类创建对象 无法实现单例

2.一开始先创建一个静态对象   目的:这个对象就是单例

3.创建一个pubilc静态方法来返回对象,供外面调用该对象

代码如下:

public class SingleInstance {
    public static SingleInstance singleInstance = new SingleInstance();
    
    private SingleInstance() {
    }
    public static void main(String[] args) {
        SingleInstance s1 = SingleInstance.singleInstance;
        SingleInstance s2 = SingleInstance.singleInstance;
        System.out.println(s1 == s2);
    }

}

 

说明这个两个对象是一样的。

以上就是饿汉式的单例模式 :

优点:线程安全的

不足:一开始就创建对象容易造成空间浪费

懒汉式:

1.创建一个类 并将构造器设置为私有的 目的:防止外面的对象去调用 无法弄成单例模式

2.声明一个静态对象但是没有初始化等到要使用的时候再去初始化对象避免占用内存空间

3.提供一个public static方法供外面调用

代码如下:

public class LazyMan {
    private LazyMan() {
    }

    private static LazyMan lazyMan;

    public static LazyMan getInstance() {

        if (lazyMan == null) {
            lazyMan = new LazyMan();
        }
        return lazyMan;
    }

    public static void main(String[] args) {
        LazyMan l1 = LazyMan.getInstance();
        LazyMan l2 = LazyMan.getInstance();
        System.out.println(l1 == l2);
    }
}

上面就是懒汉式的单例模式

优点:避免内存空间浪费

不足:线程不安全当多个线程同时调用的时候方法内部可能会发生阻塞造成线程不安全

下面我们写一个线程安全的懒汉式模式:

public class LazyMan {
    private LazyMan() {
    }

    private static LazyMan lazyMan;

    public static synchronized LazyMan getInstance() {

        if (lazyMan == null) {
            lazyMan = new LazyMan();
        }
        return lazyMan;
    }

    public static void main(String[] args) {
        LazyMan l1 = LazyMan.getInstance();
        LazyMan l2 = LazyMan.getInstance();
        System.out.println(l1 == l2);
    }
}

 懒汉式单例的线程安全否在于获取实例时是否加了锁,防止多个线程同时通过getInstance方法获取实例。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值