设计模式-单例模式详解

设计模式-单例模式详解

一、概述

单例模式说白了就是一个类就只有一个对象,为什么一个类只需要一个对象呢。在开发过程中,有些类是非常的占用内存,比较笨重,例如工厂类,这种类只需要一个对象来给我们生产产品就足够了,所以我们要保证只有一个对象,因此单例模式就诞生了。单例模式是设计模式中最容易理解,最简单的一个设计模式。

二、使用单例模式

1、懒汉式

何为懒汉式?通俗的来说当我不需要该类,就不会new 对象。

public class SingleTon {
    private String name;
    private static SingleTon singleTon = null;
    private SingleTon(String name) {
        this.name = name;
    }
    public static SingleTon getInstance(String name) {
        if (singleTon == null) {
            singleTon = new SingleTon(name);
        }
        return singleTon;
    }
    public String getName() {
        return this.name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

特点

实现简单、占用内存少,但是不是线程安全的,当有两个线程使用SingleTom的时候可能会new 出来两个对象

·测试代码

public static void main(String[] args) {
        //单例模式测试
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                SingleTon s1 = SingleTon.getInstance("s1");
                System.out.println(s1.getName());
            }
        });
        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                SingleTon s2 = SingleTon.getInstance("s2");
                System.out.println(s2.getName());
            }
        });
        t1.start();
        t2.start();
    }

正常运行结果应该是

运行结果有可能是

出现以上结果的很有可能是线程1和线程在同时执行了SingleTon.getInstance()此时都满足singleTon==null的条件,所以他们都执行了new SingleTon();

解决线程不安全问题

给getInstance添加同步修饰符,部分代码如下

public synchronized static SingleTon getInstance(String name) {
        if (singleTon == null) {
            singleTon = new SingleTon(name);
        }
        return singleTon;
}

虽然这种方式解决了线程安全问题,但当线程较多时,需要排队执行,可能会出现效率问题。

2、饿汉式

何为饿汉式?只要类被加载了,我就会new 对象。

public class SingleTon{ 
private String name;
    private static SingleTon singleTon = new SingleTon("default");
    private SingleTon(String name) {
        this.name = name;
    }
    public static SingleTon getInstance() {
        return singleTon ;
    }
    public String getName() {
        return this.name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

特点

线程安全,占用内存较大

三、总结

我们以后在开发过程中如果使用到了单例模式,根据自己项目的需求选择合适的单例模式。这篇博客先就写到这里,不再详细深入描述了。如果读者有什么不懂的地方,可以留言或者私信,后面会继续补充

2017-6-28 01:34

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值