单例模式之懒汉式

一.什么是单例模式?

单例保证一个对象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);

    }
}

结果:
在这里插入图片描述

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

答:加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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值