单例模式的几种用法

今天(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;

    }

 }

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值