一、单例模式
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。并提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
单例模式具备三个特点:
1.该类实例唯一
2.实例必须自己创建
3.必须对外提供获取自己唯一实例的方法
二、懒汉式和饿汉式
饿汉式:
类一旦加载,就把单例对象初始化完成,保证外界通过调用方法获取实例是,单例是已经存在的了。
package cn.zz;
//本类测试单例模式饿汉式
public class SingletonEh {
/*
*是否 Lazy 初始化:否
*是否多线程安全:是
*实现难度:易
*描述:这种方式比较常用,但容易产生垃圾对象。
*优点:没有加锁,执行效率会提高。
*缺点:类加载时就初始化,浪费内存。
*它基于 classloder 机制避免了多线程的同步问题,
* 不过,instance 在类装载时就实例化,虽然导致类装载的原因有很多种,
* 在单例模式中大多数都是调用 getInstance 方法,
* 但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,
* 这时候初始化 instance 显然没有达到 lazy loading 的效果。
*/
//1.构造方法私有化
private SingletonEh (){}
//2.创建单例对象
private static SingletonEh instance = new SingletonEh();
//3.创建获取单例对象的方法
public static SingletonEh getInstance() {
System.out.println("加载饿汉式....");
return instance;
}
}
懒汉式:
当外界调用getInstance()方法时才创建对象
package cn.zz;
//本类测试单例模式懒汉式
public class SingletonLh {
/*
*懒加载:是
*多线程安全:否
*实现难度:易
*描述:加锁 synchronized,支持多线程。
*这种方式 lazy loading 很明显加同步锁使线程安全,在多线程下正常工作。
*/
//1.构造方法私有化
private SingletonLh(){}
//2.创建SingletonLh类属性用来指向对象
private static SingletonLh instance;
//3.创建方法获取懒加载单例对象,加synchronized,防止多线程抢占操作
public static synchronized SingletonLh getInstance() {
//4.判断如果对象未创建,则去创建对象
if(instance==null){
instance=new SingletonLh();
}
return instance;
}
}