首页 > 其他分享 >【设计模式】单例模式——利用ThreadLocal或CAS实现单线程内部的单例模式

【设计模式】单例模式——利用ThreadLocal或CAS实现单线程内部的单例模式

时间:2024-01-05 19:05:41浏览次数:31  
标签:CASSingleton 模式 instance ThreadLocal static private 单例 设计模式

很多时候我们并不需要一个类创建的对象是全局唯一的,只需要保证在单个线程内是唯一的、线程安全的就可以。为了实现单线程内部的单例,我们可以用ThreadLocal或CAS实现。


利用ThreadLocal实现

先看代码:

public class ThreadLocalSingleton {
    private static final ThreadLocal<ThreadLocalSingleton> instance = new ThreadLocal<ThreadLocalSingleton>(){
        @Override
        protected ThreadLocalSingleton initialValue(){
            return new ThreadLocalSingleton();
        }
    };
    private ThreadLocalSingleton(){}
    
    public static ThreadLocalSingleton getInstance(){
        return instance.get();
    }
}

利用ThreadLocal可以实现单线程内部的单例模式


利用CAS实现

先看代码:

public class CASSingleton {
    private static final AtomicReference<CASSingleton> INSTANCE = new AtomicReference<CASSingleton>();
    private static CASSingleton instance;
    private CASSingleton(){}
    
    public static final CASSingleton getInstance(){
        for(;;){
            instance = INSTANCE.get();
            if(null != instance){
                return instance;
            }
            INSTANCE.compareAndSet(null,new CASSingleton());
            return INSTANCE.get();
        }
    }
}

利用CAS可以实现单线程内部的单例模式

标签:CASSingleton,模式,instance,ThreadLocal,static,private,单例,设计模式
From: https://blog.51cto.com/dongfeng9ge/9116547

相关文章

  • 代理模式
    动态代理核心代码/***@Author:jishaleng*/publicclassProxyInvocationHandlerimplementsInvocationHandler{//目标对象/委托对象privateObjecttarget;publicProxyInvocationHandler(Objecttarget){this.target=target;}......
  • 《PySpark大数据分析实战》-07.Spark本地模式安装
    ......
  • 【设计模式】单例模式——单例模式的饿汉式和枚举式实现
    饿汉式单例模式的最简单实现如下:publicclassSingletonimplementsSerializable{privatestaticSingletoninstance=newSingleton();privateSingleton(){}publicstaticSingletongetInstance(){returninstance;}}这种写法被称为“饿汉式......
  • 软件体系结构与设计模式之适配器模式
    一.单选题(共4题,8分)(单选题,2分)当想使用一个已经存在的类,但其接口不符合需求时,可以采用()设计模式将该类的接口转换成我们希望的接口。A.命令(Command)B.适配器(Adapter)C.装饰(Decorator)D.享元(Flyweight)我的答案:B:适配器(Adapter);正确答案:B:适配......
  • 软件体系结构与设计模式之桥接模式
    一.单选题1.桥接设计模式将抽象部分与它的实现部分相分离,使它们都可以独立地变化。下图为该设计模式的类图,其中,()用于定义实现部分的接口。A.AbstractionB.ConcreteImplementorAC.ConcreteImplementorBD.Implementor我的答案:D:Implementor;正确答案:D:Implementor......
  • 软件体系结构与设计模式之组合模式
    一.单选题(共4题)(单选题)一个树形文件系统体现了()模式。A.Decorator(装饰)B.Composite(组合)C.Bridge(桥接)D.Proxy(代理)我的答案:B:Composite(组合);(单选题)以下关于组合模式的叙述错误的是()。A.组合模式对叶子对象和组合对象的使用具有一致性B.组合模式可......
  • 软件体系结构与设计模式之装饰模式和外观模式
    一.单选题(共4题)(单选题)某公司欲开发一个图形控件库,要求可以在该图形控件库中方便地增加新的控件,而且可以动态地改变控件的外观或给控件增加新的行为,如可以为控件增加复杂的立体边框、增加控件的鼠标拖拽行为等。针对上述需求,使用()模式来进行设计最合适。A.适配器(Adap......
  • 软件体系结构与设计模式之享元模式和代理模式
    一.单选题(共6题)(单选题)在享元模式中,外部状态是指()。A.享元对象可共享的所有状态B.享元对象可共享的部分状态C.由享元对象自己保存和维护的状态D.由客户端保存和维护的状态我的答案:D:由客户端保存和维护的状态;正确答案:D:由客户端保存和维护的状态;(单选......
  • 责任链模式
    描述顾名思义,责任链模式(ChainofResponsibilityPattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它......
  • 软件设计模式与体系结构之运算器的设计
    实验目的与要求 深刻理解面向对象编程思想与设计原则,熟悉Java语言中类的声明、属性的声明、方法的定义、对象的创建与使用等语法知识,能够根据具体问题完成对象的抽象、类的定义及程序的编写,并在程序中使用适当的设计原则,初步体验面向对象编程的优点。实验内容 使用Java语言编写一......