单例模式的几种用法

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_37692230/article/details/79136401

今天(2018.1.23)我们来总结一下单例模式的几种用法,单例模式在面试中还是常见的,面试官通常要求我们写出一个单例模式,现在我来贴代码!

package test;

/**

 * 单例模式的意思就是说保证一个类只能被实例化一次,有几种用法呢,他究竟是怎么实现的呢,现在我们就来看一下

 * @author wuhaonan

 *Date:2018/1/23

 */

/**

 * 对于系统中的某些类来说,只有一个实例很重要,

 * 例如,一个系统中可以存在多个打印任务,

 * 但是只能有一个正在工作的任务;售票时,一共有100张票,可有有多个窗口同时售票,

 * 但需要保证不要超售(这里的票数余量就是单例,售票涉及到多线程)。如果不是用机制对窗口对象进行唯一化将弹出多个窗口,

 * 如果这些窗口显示的都是相同的内容,重复创建就会浪费资源。

 */

//第一种首先我们来写饿汉式,在类加载的时候不初始化

//这种写法缺点是多线层不能工作;

public class SingletonDemo1 {

private static SingletonDemo1 instance;//声明对象但并没有对类进行初始化

private SingletonDemo1() {}//无参构造

public static SingletonDemo1 getinstance() {

if(instance==null) {

instance=new SingletonDemo1();

}

return instance;

}

//懒汉,线层安全,在方法中加了synchronized锁,优点可以更好的为线层工作,缺点:因为锁效率会很低

 public class SingletonDemo2() {

private static SingletonDemo2 instance;

private SingletonDemo2() {}

public static synchronized SingletonDemo2 getinstance() {

if(instance==null) {

instance=new SingletonDemo2();

}

return instance;

}

 }

 //接下来我们来讲下一种饿汉式,这种方式基于classloder机制避免了多线程的同步问题,不过,instance在类装载时就实例化

 public class SingletonDemo3() {

private static SingletonDemo2 instance=new SingletonDemo2();

private SingletonDemo2() {}

public static SingletonDemo2 getinstance() {

return instance;

}

}

 //饿汉(变种),加入了static静态代码快,我们都知道类加载的时候首先会执行静态代码快

 public  class SingletonDemo4() {

private static SingletonDemo4 instance = null;

static {

instance=new SingletonDemo4(); 

}

private SingletonDemo4() {}

public static SingletonDemo4 getInstance(){

        return instance;

    }

 }

}




展开阅读全文

没有更多推荐了,返回首页