一、什么是单例模式?
保证在一个jvm中只能有一个实例。
二、单例的几种写法?
单例一共有7种写法,今天的介绍中我们只介绍两种,感兴趣的老铁们可以私底下了解其他的。
三、懒汉式和饿汉式。
区别:
懒汉式:线程不安全、效率低;
饿汉式:线程安全、效率高。
原因(原理):
懒汉式:需要时才被实例化,之后都是用的同一个实例;
饿汉式:class文件被加载时就实例化了。
四、代码演示
1.懒汉式:
public class Singleton {
//只能有一个实例
private static Singleton singleton = null;
//私有化构造器
private Singleton(){}
//获取实例的方法
static public Singleton getInstance(){
if (singleton==null) {
//保证线程安全
synchronized (Singleton.class) {
singleton = new Singleton();
}
}
return singleton;
}
/*说明:
* Singleton通过将构造方法限定为private避免了类在外部被实例化,
* 在同一个虚拟机范围内,Singleton的唯一实例只能通过getInstance()方法访问。
* (事实上,通过Java反射机制是能够实例化构造方法为private的类的,
* 那基本上会使所有的Java单例实现失效。此问题在此处不做讨论,
* 姑且掩耳盗铃地认为反射机制不存在。)
*/
}
说明:因为new一个对象的时候可能会发发生线程安全问题,所以在getInstance这个方法new对象的时候加个synchronizated关键字,保证线程安全。所以在这里给刚毕业找工作的大学生建议笔/面试过程中有需要手写单例模式的时候写懒汉式的,这样可以显得你懂得比别人稍微多,在线程安全的方面面试官会不断挖掘你,同事线程安全问题也是非常重要的。
2.饿汉式
public class Singleton2 { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } //私有化构造器 private Singleton2() { } //创造实例化对象 private static Singleton2 singleton2 = null; //获取实例的方法 public static Singleton2 getSingleton2(){ if (singleton2==null) { singleton2 = new Singleton2(); } return singleton2; } //测试 public static void main(String[] args) { Singleton2 s1 = Singleton2.getSingleton2(); s1.setName("123"); System.out.println(s1.getName()); Singleton2 s2 = Singleton2.getSingleton2(); s2.setName("1234"); System.out.println(s2.getName()); //测试创建的是不是同一个对象---true是同一个对象 System.out.println(s1==s2); } }
小结:虽然单例很简单但是工作中会用到不少,所以希望大家对简单的东西能够达到精通。还有在平时的学习中多比较的去学习这样对新知识的掌握会更加牢固,对以后的使用也会更加的得心应手。