饿汉式和饱汉式单例模式

单例模式的概念
单例对象的类必须保证只有一个实例存在

懒汉式:指全局的单例实例在第一次被使用时构建。
饿汉式:指全局的单例实例在类装载时构建。

如何保证单例
一般实例化类的对象时,基本都是通过new 的方式来实例化一个对象,其实就是调用了实例化类的默认构造方法,所以为了保证类只有一个对象,我们需要将类的对象设置为private
①控制类的创建,不让其他类创建本类的对象,即需要设置private属性
②在本类中定义一个本类的对象
测试如下:

public class singleTest {
    public static void main(String[] args) {
        Singleton s1 = Singleton.singleton;
        Singleton s2 = Singleton.singleton;
        System.out.println(s1==s2);
    }
}
class Singleton{
    private Singleton(){}
    public static Singleton singleton = new Singleton();
}

输出结果为:
输出结果

结果为true,可以看出,通过创建私有构造函数这样是可以保证单例的

这样还有问题,你可以直接修改对象值

public class singleTest {
    public static void main(String[] args) {
        Singleton s1 = Singleton.singleton;
        s1 = null;
        Singleton s2 = Singleton.singleton;
        System.out.println(s1==s2);
    }
}

class Singleton{
    private Singleton(){}
    public static Singleton singleton = new Singleton();
}

输出结果为
输出结果
上述线程不安全

饿汉式单例模式

public class singleTest {
    public static void main(String[] args) {
        Singleton s1 = Singleton.getInstance();
        Singleton s2 = Singleton.getInstance();
        System.out.println(s1==s2);
    }
}
class Singleton{
    private Singleton(){}
    private static Singleton singleton = new Singleton();
    public static Singleton getInstance(){
        return singleton;
    }
}

单例模式的懒汉式[线程不安全,不可用]

public class Singleton {
	private static Singleton singleton = null;
	private Singleton() {};
	public static Singleton getInstance(){
		if(singleton==null){
			singleton=new Singleton();
		}
		return singleton;
	}
}

这种方式是在调用getInstance方法的时候才创建对象的,所以它比较懒因此被称为懒汉式。

单例模式懒汉式双重校验锁[推荐用]

public class Singleton {
    private static volatile Singleton singleton;
    private Singleton() {}
    public static Singleton getInstance() {
        if (singleton== null) {
            synchronized (Singleton.class) {
                if (singleton== null) {
                    singleton= new Singleton();
                }
            }
        }
        return singleton;
    }
}

此博客只用于理解单例的概念

参考博客:
http://blog.csdn.net/dmk877/article/details/50311791
https://blog.csdn.net/qq_37904799/article/details/81807954

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