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