Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >CAS 单例模式

CAS 单例模式

原创
作者头像
大发明家
发布于 2021-12-18 03:37:51
发布于 2021-12-18 03:37:51
4550
举报
文章被收录于专栏:技术博客文章技术博客文章

乐观锁的一种实现方式——CAS

在JDK1.5

中新增java.util.concurrent(J.U.C)就是建立在CAS之上的。相对于对于synchronized这种阻塞算法,CAS是非阻塞算法的一种常见实现。所以J.U.C在性能上有了很大的提升。

借助CAS(AtomicReference)实现单例模式:

代码语言:txt
AI代码解释
复制
public final class SingleInstance {
代码语言:txt
AI代码解释
复制
    private static final AtomicReference<SingleInstance> instanceRef = new AtomicReference<>();
代码语言:txt
AI代码解释
复制
    private SingleInstance() {
代码语言:txt
AI代码解释
复制
    }
代码语言:txt
AI代码解释
复制
    public static SingleInstance getInstance() {
代码语言:txt
AI代码解释
复制
        for (; ; ) {
代码语言:txt
AI代码解释
复制
            SingleInstance instance = instanceRef.get();
代码语言:txt
AI代码解释
复制
            if (instance != null) {
代码语言:txt
AI代码解释
复制
                return instance;
代码语言:txt
AI代码解释
复制
            }
代码语言:txt
AI代码解释
复制
            instanceRef.compareAndSet(null, new SingleInstance());
代码语言:txt
AI代码解释
复制
        }
代码语言:txt
AI代码解释
复制
    }
代码语言:txt
AI代码解释
复制
}

与sychronized实现的单例相比

优点:

  1. 无锁

缺点:

  1. 对象可能会被创建多个,设置失败的会被舍弃
  2. 代码相对稍微复杂

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
漫话:什么是单例模式?
周末了,临近五一劳动节,女朋友还没有想好要去哪里玩,还在看着各种攻略。我则在旁边一边看书默默的心疼着我的钱包。突然女朋友开始发问:
乔戈里
2019/05/23
6250
漫话:什么是单例模式?
Java并发之原子变量及CAS算法-下篇
本文主要讲在Java并发编程的时候,如果保证变量的原子性,在JDK提供的类中是怎么保证变量原子性的呢?。对应Java中的包是:java.util.concurrent.atomic包下。因为涉及到了CAS算法,需要对CAS算法讲解及CAS算法三个问题怎么解决以及和Synchroized比较。文章比较长,所以就分为上下两个篇幅讲解。本文是上篇《Java并发之原子变量及CAS算法-下篇》
凯哥Java
2020/03/15
4600
Java并发之原子变量及CAS算法-下篇
什么是CAS锁
在并发编程中,CAS(Compare And Swap)锁是一种乐观锁机制,用于实现多线程之间的同步。CAS操作包括三个步骤:读取内存值、比较内存值与预期值、如果相等则更新内存值。CAS锁可以有效地解决传统锁机制中的性能问题和死锁问题,是并发编程中常用的同步手段之一。
GeekLiHua
2025/01/21
1000
Java并发编程实战系列15之原子遍历与非阻塞同步机制(Atomic Variables and Non-blocking Synchronization)
近年来,在并发算法领域的大多数研究都侧重于非阻塞算法,这种算法用底层的原子机器指令来代替锁来确保数据在并发访问中的一致性,非阻塞算法被广泛应用于OS和JVM中实现线程/进程调度机制和GC以及锁,并发数据结构中。 与锁的方案相比,非阻塞算法都要复杂的多,他们在可伸缩性和活跃性上(避免死锁)都有巨大的优势。 非阻塞算法,顾名思义,多个线程竞争相同的数据时不会发生阻塞,因此他能在粒度更细的层次上进行协调,而且极大的减少调度开销。 15.1 锁的劣势 独占,可见性是锁要保证的。 许多JVM都对非竞争的锁获取和释放
JavaEdge
2018/04/28
8070
cas 原理分析
顾名思义,就是很悲观,假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁。
全栈程序员站长
2022/11/03
3480
cas 原理分析
Java并发编程实战系列(15)-原子遍历与非阻塞同步机制
非阻塞算法,用底层的原子机器指令代替锁,确保数据在并发访问中的一致性。 非阻塞算法被广泛应用于OS和JVM中实现线程/进程调度机制和GC及锁,并发数据结构中。
JavaEdge
2022/11/30
2180
Java并发编程实战系列(15)-原子遍历与非阻塞同步机制
看完你就应该能明白的悲观锁和乐观锁
Java 按照锁的实现分为乐观锁和悲观锁,乐观锁和悲观锁并不是一种真实存在的锁,而是一种设计思想,乐观锁和悲观锁对于理解 Java 多线程和数据库来说至关重要,那么本篇文章就来详细探讨一下这两种锁的概念以及实现方式。
cxuan
2019/09/27
3910
看完你就应该能明白的悲观锁和乐观锁
关于Java锁机制面试官会怎么问
悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。再比如Java里面的同步原语synchronized关键字的实现也是悲观锁。
Bug开发工程师
2018/07/23
5620
关于Java锁机制面试官会怎么问
单例模式的七种写法,你都知道吗?
因为instance是个静态变量,所以它会在类加载的时候完成实例化,不存在线程安全的问题。
三分恶
2021/09/14
4660
【JUC】010-深入单例模式、CAS、ABA问题、可重入锁、自旋锁、死锁排查
https://blog.csdn.net/qq_29689343/article/details/105046493
訾博ZiBo
2025/01/06
890
【JUC】010-深入单例模式、CAS、ABA问题、可重入锁、自旋锁、死锁排查
设计模式学习笔记(四)单例模式的实现方式和使用场景
单例模式可以说是Java中最简单的设计模式,也是技术面试中频率极高的面试题。因为它不仅涉及到设计模式,还包括了关于线程安全、内存模型、类加载等机制。所以下面就来分别从单例模式的实现方法和应用场景来介绍一下单例模式
归思君
2023/10/16
4690
CAS
在此部分讲解CAS概念是因为后面部分章节将会有很多地方使用到他,因为CAS是并发框架的基石,所以相当重要,读者需提前了解。本章节从概念、案例、源码浅析,一直到Java中一些典型的地方使用到CAS进行介绍。
胖虎
2020/12/08
8990
单例模式的八种写法
单例模式作为日常开发中最常用的设计模式之一,是最基础的设计模式,也是最需要熟练掌握的设计模式。单例模式的定义是:保证一个类仅有一个实例,并提供一个访问它的全局访问点。那么你知道单例模式有多少种实现方式吗?以及每种实现方式的利弊呢?
王金龙
2020/02/24
5860
非阻塞同步机制和CAS
我们知道在java 5之前同步是通过Synchronized关键字来实现的,在java 5之后,java.util.concurrent包里面添加了很多性能更加强大的同步类。这些强大的类中很多都实现了非阻塞的同步机制从而帮助其提升性能。
程序那些事
2020/07/08
4860
(70) 原子变量和CAS / 计算机程序的思维逻辑
从本节开始,我们探讨Java并发工具包java.util.concurrent中的内容,本节先介绍最基本的原子变量及其背后的原理和思维。 原子变量 什么是原子变量?为什么需要它们呢? 在理解synchronized一节,我们介绍过一个Counter类,使用synchronized关键字保证原子更新操作,代码如下: public class Counter { private int count; public synchronized void incr(){ coun
swiftma
2018/01/31
7690
设计模式 - 创建型模式_7种单例模式实现
单例模式可以说是整个设计中最简单的模式之⼀,在编程开发中经常会遇到这样⼀种场景,那就是需要保证⼀个类只有⼀个实例哪怕多线程同时访问,并需要提供⼀个全局访问此实例的点。
小小工匠
2023/02/23
5830
设计模式 - 创建型模式_7种单例模式实现
JUC并发编程(二)认识volatile,单例模式,各种锁
JMM : Java内存模型,不存在的东西,概念!约定! 关于JMM的一些同步的约定: 1. 线程解锁前,必须把共享变量立刻刷回主存。 2. 线程加锁前,必须读取主存中的新值到工作内存中! 3. 加锁和解锁是同一把锁
HcodeBlogger
2020/07/14
3300
JUC并发编程(二)认识volatile,单例模式,各种锁
Java 并发核心机制
Java 的 java.util.concurrent 包(简称 J.U.C)中提供了大量并发工具类,是 Java 并发能力的主要体现(注意,不是全部,有部分并发能力的支持在其他包中)。从功能上,大致可以分为:
静默虚空
2020/01/02
4760
Java并发编程之cas理论(无锁并发)
前面看到的AtomicInteger的解决方法,内部并没有用锁来保护共享变量的线程安全。那么它是如何实现的呢?
冬天vs不冷
2025/01/21
760
Java并发编程之cas理论(无锁并发)
java CAS详解[通俗易懂]
CAS(compare and swap),比较并交换。可以解决多线程并行情况下使用锁造成性能损耗的一种机制.CAS 操作包含三个操作数—内存位置(V)、预期原值(A)和新值(B)。如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值。否则,处理器不做任何操作。一个线程从主内存中得到num值,并对num进行操作,写入值的时候,线程会把第一次取到的num值和主内存中num值进行比较,如果相等,就会将改变后的num写入主内存,如果不相等,则一直循环对比,知道成功为止。
全栈程序员站长
2022/09/08
7560
java CAS详解[通俗易懂]
相关推荐
漫话:什么是单例模式?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档