单例模式的概念
单例对象的类必须保证只有一个实例存在
懒汉式:指全局的单例实例在第一次被使用时构建。
饿汉式:指全局的单例实例在类装载时构建。
如何保证单例
一般实例化类的对象时,基本都是通过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