java中单例模式是一种常见的设计模式, 单例模式有以下特点:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
单例模式适用场景:
1. 需要生成唯一序列的环境 。
2. 需要频繁实例化然后销毁的对象。
3. 创建对象时耗时过多或者耗资源过多,但又经常用到的对象。
4. 方便资源相互通信的环境。
public class Demo {
public static void main(String[] args) {
Danli a = new Danli();
Danli b = new Danli();
System.out.println(a == b);
}
}
class Danli{
public Danli(){
}
}
一、恶汉式单例
特点:线程安全,调用效率高,但是不能延时加载
public class Demo {
public static void main(String[] args) {
Danli a = Danli.getInstance();
Danli b = Danli.getInstance();
System.out.println(a == b);
}
}
class Danli{
//1、隐藏构造器
private Danli(){
}
//2、实例化这个类(要私有的、静态的、不可改变的)
private static final Danli Instance = new Danli();
//3、创建静态工厂方法,让外部可以调用
public static Danli getInstance(){
//恶汉式单例
return Instance;
}
}
输出结果如下:
二、懒汉式单例
特点:线程安全,调用效率不高,但是能延时加载
public class Demo {
public static void main(String[] args) {
Danli a = Danli.getInstance();
Danli b = Danli.getInstance();
System.out.println(a == b);
}
}
class Danli{
//1、隐藏构造器
private Danli(){
}
//2、类初始化时,不初始化这个对象(延时加载,真正用的时候再创建)
private static Danli Instance;
//3、创建静态工厂方法 ,让外部可以获取实例
//synchronized 同步修饰符,在多个线程中,该修饰符用于在运行前,对他所属的方法加锁,以防止其他线程的访问,运行结束后解锁。
public static synchronized Danli getInstance(){
if(Instance == null){
Instance = new Danli();
}
return Instance;
}
}
运行结果如下: