单例模式之懒汉式

一.什么是单例模式?

单例保证一个对象JVM中只能有一个实例,常见单例 懒汉式、饿汉式
什么是懒汉式,就是需要的才会去实例化,线程不安全。
什么是饿汉式,就是当class文件被加载的时候,初始化,天生线程安全。

实例:要点:构造方法私有化

package com.edu.emple2;

/**
 * @author shkstart
 * @date 2019/6/11- 22:15
 */
//保证在jvm中只能有一个实例
class Singleton{
    //懒汉式,当需要时才会创建对象
   static private Singleton singleton;
    //构造函数私有化
    private Singleton(){
    }

    //保证返回一个实例
    static  public synchronized  Singleton getSingleton(){
        if(singleton == null){
            Singleton singleton = new Singleton();
        }
        return singleton;
    }
}
public class Test004 {

    public static void main(String[] args) {

        Singleton s1 = Singleton.getSingleton();
        Singleton s2 = Singleton.getSingleton();
        System.out.println(s1==s2);

    }
}

结果:
单例模式之懒汉式_第1张图片

但是会产生线程不安全的情况,如何解决?

答:加synchronized关键字

 //保证返回一个实例,只有一个线程访问getSingleton方法
    static  public synchronized  Singleton getSingleton(){
        if(singleton == null){
            Singleton singleton = new Singleton();
        }
        return singleton;
    }
但是这样效率会非常低,因为加入synchronized 只允许一个线程访问,当singleton 不等于null,还只允许一个线程访问,这样效率会很低。
解决办法:在singleton == null 时再加锁
 //保证返回一个实例,只有一个线程访问getSingleton方法
    static  public   Singleton getSingleton(){
        if(singleton == null){
            synchronized(Singleton.class){  //静态的,用当前字节码文件上锁
                if(singleton == null){ //双重检验锁
                    Singleton singleton = new Singleton();
                }
                
            }
            
        }
        return singleton;
    }

你可能感兴趣的:(java)