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