单例模式详解

本文详细介绍了Java中的单例模式,包括饿汉方式和懒汉方式的实现。饿汉方式在类加载时即完成初始化,线程安全但可能导致资源浪费;懒汉方式则在首次调用时初始化,延迟加载但需要处理线程安全问题,这里使用了volatile关键字来确保线程可见性和禁止指令重排序。
摘要由CSDN通过智能技术生成

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

二.单例模式的两种实现方式:
1.饿汉方式(线程安全的)
2.懒汉方式

写单例模式(不允许new)三个步骤:
1.将构造函数设置为私有的
2.创建一个静态的类变量(让第三步的方法返回的)
3.给外部提供获取单例的方法

饿汉方式:
优点:实现简单、不存在线程安全问题,因为饿汉的方式是随着程序的启动而初始化的,因为类加载是线程安全的,所以他是线程安全的
缺点:随着程序的启动而启动,有可能在整个程序的运行周期里面都没有用到,这样就带来了不必要的开销

 //饿汉方式
    static class Singleton{
        //1.将构造函数设置为私有的
        private Singleton(){

        }
        //2.创建一个静态的类变量(让第三步的方法返回的)
        private static Singleton singleton=new Singleton();
        //3.给外部提供获取单例的方法
        public static Singleton getInstance(){
            return singleton;
        }
    }

懒汉方式(要求能够手写):
它不会随着程序的启动而初始化,而是等到有人调用它时,它才会初始化。

//懒汉模式
    static class Singleton{
        //1.将构造函数设置为私有的
        private Singleton(){
        }
        //2.设置一个静态的类变量,为第三部返回使用
        private static volatile Singleton singleton=null;
        //3.为外部提供获取单例的方法
        public static Singleton getInstance(){
            if(singleton==null){
                synchronized (Singleton.class){
                    if(singleton==null){
                        singleton=new Singleton();
                    }
                }
            }
            return singleton;
        }
    }

在这里插入图片描述

实例化时分为三步,所以禁止指令重排序的问题来保证线程安全,用volatile 关键字
在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值