java单例模式

单例模式

  1. 单例模式的定义:

答:一个类只有一个实例,并且提供一个全局访问点。

  1. 为什么要使用单例模式?

答:有些类如线程、缓冲,这些只能有一个实例,多个实例会产生冲突,所以必须保证代码中只有一个实例,第一个解决方法就是声明一个全局变量,将对象赋值给全局变量,这缺点就是我们必须一开始就创建对象,但应该是在需要的时候才创建对象。该全局变量应该保持只有一份,并且对共享他的对象都是可见的,这也就是唯一性和全局访问点。而单例模式就能确保这点。

  1. 运行的原理:

答:通过声明一个自己本身的静态实例,构造器使用private修饰,通过静态方法返回。静态变量在程序中只有一个,确保了实例只有一个。并且构造器是私有的,其他类无法产生实例。

  1. 单例模式的具体实现分类:

答:懒汉,饿汉,双重检验锁,枚举,静态内部类

4.1     懒汉模式。

答:静态实例不进行实例化,在静态方法中进行实例化并且返回。加载时没有实例化对象,加载块,但在调用获取对象时,要实例化,速度较慢。懒汉模式:线程不安全,效率很低。

public class SingletonDemo1 {

    private static SingletonDemo1 instance ;

    private SingletonDemo1() {

    }

    public static SingletonDemo1 getInstance() {

if(instance==null){

instance=new  SingletonDemo1 ();}

        return instance;

    }

}

4.2     饿汉模式。

答:静态实例进行实例化。在加载类时候就进行实例化。

public class SingletonDemo1 {

    private static SingletonDemo1 instance=new SingletonDemo1 () ;

    private SingletonDemo1() {

    }

    public static SingletonDemo1 getInstance() {

        return instance;

    }

}

 

4.3     静态内部类。

答:在静态内部类内定义静态实例,并且在内部类内进行实例化。只有在调用内部类的变量时,才会对静态实例进行加载实例化。相比于饿汉模式,可以设置一定的延时实例化。

public class SingletonDemo1 {

    private static class Singletonholder{

private static final SingletonDemo1 instance=new SingletonDemo1 () ;}

    private SingletonDemo1() {

    }

    public static SingletonDemo1 getInstance() {

        return Singletonholder.instance;

    }

}

 

 

4.4     枚举

4.5     双重检验锁

答:在懒汉的基础上,在静态方法中,使用双锁的办法判断来进行实例化。既能保证线程安全,又能不对性能引起太大影响。

posted @ 2020-08-18 21:27  飞独破  阅读(35)  评论(0)    收藏  举报