设计模式:单例模式

1、懒汉式:需要获取对象的时候再实例化。

复制代码
/**
 * 懒汉式。在类中仅仅只是声明,外部需要调用单例时才实例化。
 */
public class Singleton{
    private  static  Singleton  singleton;
    //构造器私有化
    private Singleton(){

    }
    //注意,记得加同步锁,保证线程安全
    public  static synchronized  Singleton getInstance(){
        if(singleton==null) {
            singleton=new Singleton();
        }
        return singleton;
    }

}
复制代码

 



2、饿汉式:直接实例化对象,调用的时候再返回对象。

复制代码
/**
 * 饿汉式。在类中实例化,外部调用时直接返回单例。
 */
public class Singleton{
    private static Singleton singleton=new Singleton();
    //构造器私有化
    private Singleton(){

    }

    public static  Singleton  getInstance(){
        return singleton;
    }
}
复制代码

 

3.线程安全的单例模式

直接使用synchronized锁住方法,效率比较差。

主要使用volatile修饰变量,使用双重检查锁(Double Check Lock)。保证线程安全并提高效率。

复制代码
public class Singleton{
    /**
     * 懒汉式。先声明,等要用的时候再实例化。
     * 使用volatile修饰,保证可见性。
     */
    private  static volatile Singleton singleton=null;

    private Singleton(){
        //..
    }

    /**
     * 使用双重检查锁,保证线程安全。
     * static修饰为静态变量,可以直接通过类名调用。
     */
    public static Singleton getSingleton() {
        if(singleton==null) {
            synchronized(singleton) {
                if(singleton==null) {
                    singleton=new Singleton();
                }
            }
        }
        return singleton;
    }

}
复制代码

 


单例模式思考:

1.单例模式有什么用?

节约系统资源,不用一直新建对象。

2.为什么要用static修饰对象?

确保对象的唯一性。内存中始终只有一个实例,而static修饰就保证了这一点,在任何时刻任意类中引用都是唯一一个实例在操作。

3.为什么构造器要用private?

使外部无法访问构造方法,无法通过new实例化,只能调用getInstance()获取实例。

4.为什么要用synchronized修饰?

保证线程安全,数据不会混乱

 

更详细的资料:

单例模式与双重检查锁

 

posted on   乐之者v  阅读(150)  评论(0编辑  收藏  举报

编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示