深入理解volatile的内存语义,并通过volatile写一个线程安全的单例

本文深入探讨volatile关键字的内存语义,包括通过缓存一致性原则和内存屏障来防止重排序,保证线程间可见性和有序性。接着分析了volatile在单例模式中的应用,特别是如何通过双重检查锁定和volatile避免多线程环境下可能出现的问题,确保线程安全。
摘要由CSDN通过智能技术生成

前言:

对缓存一致性协议以及内存屏障和happens-before原则不太了解的小伙伴建议先百度google维基一下或移步的我的另一篇博客 《浅谈缓存一致性原则和Java内存模型(JMM)》之后再看这篇博客更好理解哦 在研究Java并发包之前一直以为volatile关键字只是一个打辅助的,之后发现J.U.C包的底层就是依靠volatile关键字和CAS实现的。那我们现在就来看一看volatile关键字吧~

一.volatile写/读的内存语义

**volatile写的内存语义:** 当写一个变量的时候,JMM会把该线程的私有内存中的共享变量值更新到主内存中,并将其他线程中的值置为无效的; **volatile读的内存语义:** 当读一个变量的时候,JMM会先判断是否私有空间内的值是否失效,若失效,线程接下来会从主存中读取变量。 **总结一下volatile的写/读语义:** 当一个线程对另外一个volatile关键字修饰的共享变量x进行了写操作,那么在别的线程读到这个共享变量x的时候读到的值一定是更新过的有效值。 如果将这个过程模拟一下可以认为是线程间的一个线程通信,在线程A进行了volatile变量的写操作后,告知B线程该变量的值已经失效,需要从主内存中去读: ![这里写图片描述](https://img-blog.csdn.net/20180806204223553?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Nkcl96ZA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) 但是由于JMM是以**共享变量方式**进行通信的,不能通过消息传递的方式实现,接下来看一下
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值