跨语言设计思想--设计模式【懒汉单例】,并发要你命哦

61 阅读2分钟

前言

  • 入门开发其实是很简单的,尤其对于中高级开发来说学习掌握一门语言只是语法的事情。因为他们掌握了语法之后就可以借助通用的设计模式思想来结构化自己的代码。今天我们开辟一个新章节就是设计模式。设计模式是不针对具体某种语言他是代码层面的设计。

非线程

  • 对于初学者而言,我再三思考决定先介绍下无多线程场景下懒汉式单例。上文也介绍了因为饿汉模式是初始化时就创建对象的,虽然粗暴但是能很好的规避掉并发的问题。与之相对的就是懒汉式。因为懒汉式是懒加载所以伴随而来的就是并发问题。针对并发我们又分为三种懒汉式单例
  • 分别是非多线程懒汉式单例、多线程懒汉式单例、双检查锁懒汉式单例。今天我们的主题是非多线程懒汉式单例

非多线程懒汉式

  • 什么叫非多线程懒汉式单例呢,其实就是我们最简单的懒汉式单例。将对象的创建放在获取对象实例的方法上,正常情况下我们习惯叫他getInstance .
  • 在这个方法中获取对象实例是进行判断,如果实例还没有创建的话,我们就新建实例并且完成赋值,否则直接返回
public static Person getInstance()
{
    try
    {
        Thread.sleep(30);
    }
    catch (InterruptedException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    if(person==null){
        person=new Person();
    }
    return person;
}
  • 上面的sleep笔者这是是为了测试在并发场景下的问题。正规的单例中方法肯定是不能存在这个休眠的方法的,并没有实际意义

测试

public static void main(String[] args)
{
    System.out.println("获取第一个Person类:");
    Person person1=SingleFactory.getInstance();
    System.out.println(person1.toString());
    System.out.println("**************************");
    System.out.println("获取第二个Person类:");
    Person person2=SingleFactory.getInstance();
    System.out.println(person2.toString());
}
  • 这里我们测试可以发现两个对象都是想通的。这是我们实验性的单例模式测试。如果这个时候我们通过多线程去获取实例你就会发现总会有不同的实例对象产生。至于原因吗我们上面也都分析了。

总结

  • 对于并发较少的系统使用这种单例模式未尝不可。但是为了系统能够拥有更高的扩展性和稳定性。这里还是建议大家不要用