java实现单例模式线程安全

1、饿汉模式

//饿汉模式:(线程安全)
public class Singleton {
    // 静态私有成员变量
    private static Singleton instance = new Singleton();
    // 私有构造函数
    private Singleton() {
    }
  // 静态方法,返回唯一实例
    public static Singleton getInstance() {
        return instance;
    }
}

优点:线程安全,效率比懒汉快
缺点:它不管是是否被调用都会提前创建类的实例,所以资源利用率比较低,系统加载时间比较长。

2、懒汉模式

// 懒汉模式:(线程不安全,需要通过双重检查锁定机制控制)(双检锁)
public class Singleton {
   // 静态私有成员变量
    private static Singleton instance = null;
  // 私有构造函数
    private Singleton() {
    }
  // 静态公有工厂方法,判断成员变量是否为空,不为空则实例化
    public static Singleton getInstance() {
        if(instance == null)
            instance = new Singleton();
        return instance;
    }
}

优点:实现了延迟加载
缺点:线程不安全,需要克服多线程同时访问的问题,需要通过双检锁(双重检查锁定机制)来进行控制,导致性能受到一定影响。

3、双检锁模式

public class Singleton {
  // 私有静态成员变量
    private static volatile Singleton instance = null;
  // 私有构造函数
    private Singleton() {
    }
  // 共有静态工厂方法
    public static Singleton getInstance() {
  // 判断 instance 是否为空,
  // 为空->加锁,创建实例(为了进程安全,再次判断)
  // 不为空->返回实例
        if(instance == null) {
            synchronized (Singleton.class) {
                if(instance == null)
                    instance = new Singleton();
            }
        }
        return instance;
    }
}

优点:线程安全
缺点:因为加锁了,性能受到影响

静态内部类

public class Singleton{
	//私有构造函数
	private Singleton(){
	}
    //静态内部类
    private static class HolderClass{
    	private static final Singleton instance = new Singleton();
    }
	//静态公有工厂方法,返回内部类中创建的实现
	public static singleton getInstance(){
		return HolderClass.instance;
	}
}

原理:加载Singleton类的过程中,会为类变量在方法区中分配内存空间并初始化,但是,并不会加载静态内部类HolderClass.
当调用Singleton.getInstance(),执行return HolderClass.instance语句时,HolderClass类才会被加载,instance对象才会被初始化。

枚举

public enum Singleton {

    INSTANCE;
    
    public void doSomething() {
        System.out.println("doSomething");
    }
}
public class Main {
    public static void main(String[] args) {
        Singleton.INSTANCE.doSomething();
    }
}

你可能感兴趣的:(java,单例模式,开发语言)