单例模式
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
条件(注意)
由于单例模式是一种当其他类访问时,它是作为唯一一个实例返回的,所以在使用单例的场景中应该注意一下的问题:
- 单例类只能有一个实例。
- 单例类必须自己创建自己的唯一实例。
- 单例类必须给所有其他对象提供这一实例。
优点
- 实现单例模式的类只会生成一个实例,这有效的减少了系统的开销。
- 可以系统的配置全局访问点,优化环共享资源访问。
实现方式
名称 | 效果 |
---|---|
饿汉式 | 线程安全,调用效率高,但是不能延时加载 |
懒汉式 | 线程安全,调用效率不高,但是能延时加载 |
双重检测锁式 | 由于它是运行有JVM底层内部模型原因,偶尔会出现问题,不建议使用 |
静态内部类 | 线程安全,调用效率高,可以延时加载 |
枚举单例 | 线程安全,调用效率高,不能延时加载 |
饿汉式
package _1;
/**
*
* @author 大帅比
*饿汉式:static,不能延时加载,线程安全,调用效率高
*1、私有化构造方法
*2、类初始化时就立即加载类对象
*3、提供公开方法用于调用单例类
*懒汉式:延时加载,线程安全,调用效率不高
*区别:
*在调用方法添加实例化的判断
*方法添加 synchronized实现同步
*双重检测锁模式(double check lock)
*将同步锁放到判断语句中
*synchronized(类.class){
*
*
*}
*静态内部类模式:延时加载,调用效率高,线程安全;(常用)
*枚举单例模式
*
*
*
*/
public class HungaryMan{
/**
第一步:私有化构造器
第二步:创建实例对象
第三步:通过对外接口实现实例的发送
*/
private static HungaryMan a = new HungaryMan();
private HungaryMan() {
}
public static HungaryMan rHungaryMan() {
return a;
}
}
懒汉式
与饿汉式的区别仅仅在于是否即时加载,即当电脑真正使用到的时候才会加载。
public class Lazy{
/**
第一步:私有化构造器
第二步:创建实例对象
第三步:通过对外接口实现实例的发送
*/
private static Lazy a;
private Lazy() {
}
public static synchronized Lazy rLazy() {
if(a == null){
a = new Lazy();
}
return a;
}
}