单例模式(饿汉方式、懒汉方式)


单例模式:全局唯一并且所有程序都可以使用的对象,就是单例模式。

1.饿汉方式(线程安全的)

(1)代码实现

public class ThreadDemo84 {
    //单例类
    static class Singleton{
        //1.将构造函数设置为私有的(不让外部常见)
        private Singleton(){
        }

        //2.创建一个静态的类变量(让底下第三步方法返回的)
        private static Singleton singleton=new Singleton();

        //3.给外部接口提供的获取单例的方法
        public static Singleton getInstance(){
            return singleton;
        }
    }
    static Singleton s1=null;
    static Singleton s2=null;
    public static void main(String[] args) throws InterruptedException {
        Thread t1=new Thread(new Runnable() {
            @Override
            public void run() {
                s1=Singleton.getInstance();
            }
        })  ;
        Thread t2=new Thread(new Runnable() {
            @Override
            public void run() {
                s2=Singleton.getInstance();
            }
        });
        t1.start();
        t1.join();
        t2.start();
        t2.join();
        System.out.println(s1.equals(s2));
    }
}

(2)饿汉方式的优缺点

优点

实现简单、不存在线程安全的问题,因为饿汉的方式是随着程序的启动而初始化的,因为类加载是线程安全的,所以他是线程安全的。

缺点

随着程序的启动而启动,有可能在整个程序的运行周期里面都没有用到,这样就带来了没有必要的开销。

2.懒汉方式

(1)代码实现

①懒汉实现版本一(非线程安全的)

//1.设置私有的构造函数
    static class Singleton{
    }
    //2.创建一个静态的类变量
    private static Singleton singleton=null;
    //3.提供给外部调用(返回一个单例对象给外部)
    public static Singleton getInstance(){
        if(singleton==null){
            //第一次访问,进行实例化
            singleton=new Singleton();
        }
        return singleton;
    }

②版本二:可以保证线程安全,锁粒度太多,性能不高

public static Singleton getInstance() throws InterruptedException {
        if(singleton==null){
            Thread.sleep(1000);
            //第一次访问,进行实例化
            singleton=new Singleton();
        }
        return singleton;
    }

③双重校验锁

在这里插入图片描述

④防止指令重排序

//1.设置私有的构造函数
    static class Singleton{
    }
    //2.创建一个静态的类变量(volatile)
    private static volatile Singleton singleton=null;
    //3.提供给外部调用的方法
    public static Singleton getIntance(){
        if(singleton==null){
            try{
                Thread.sleep(1000);
            }catch (InterruptedException e){
                e.printStackTrace();
            }
            synchronized (Singleton.class){
                if(singleton==null){
                    singleton=new Singleton();
                }
            }
        }
        return singleton;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秃头小宝儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值