说起Java中的多线程,就不得不说volatile关键词volatile关键词执行修饰变量和实例变量,不能修饰方法参数,局部变量和实例常量。

volatile是Java提供的一种轻量级的同步机制,在并发编程中,它是担任了重要的角色。同synchronized相比(synchronized通常称为重量级锁),volatile更轻量级。

想要了解votatile的来龙去脉,就必须了解CPU缓存模型和java内存模型,本文介绍前者。

众所周知,计算机所有的运算操作都是在cpu寄存器来完成的,运算操作无非就是数据的读取和写入操作,但CPU能访问的数据只能是计算机内存(RAM),虽然相比于普通硬盘和固态硬盘,RAM的速度远超这两者,但比起CPU的处理速度来说,这之间的差距可达数千倍。

举个简单的例子,随着光纤的普遍接入,网络速度大大提高,可不管下载速度如何提高,它的上限都受制于硬盘的写入速度,就算下载速度超过了10GB/s,可固态硬盘写入速度撑死也只能达到它的十分之一。

CPU也一样,由于运算速度和内存访问速度上面的不对等,导致CPU资源会受到极大的限制,于是就有在CPU主存和内存之间增加了缓存的设计。

看图中I9 9900K的参数,现在的缓存可以增加到3级。

在程序的运行中,会将运算所需要的数据复制一份到CPU缓存中,这样CPU就可以直接对缓存中的数据进行运算,当运算结束后,将缓存中的数据刷新到内存中,依靠这样的方式,极大提高了CPU的吞吐量。

在提高了吞吐量的同时,也出现了另一个问题,缓存不一致、

试想有一段运算操作:i++读取i的值到cpu cache中

对i进行加1操作

将结果保存到cpu cache中

运算完成,将数据刷新到内存中

这里就存在和java一样的多线程问题,在两个线程同时对i进行操作的时候,每个线程都有自己的工作内存,变量i会在多个线程的本地内存中都保存一个副本,假设i值为1,在同一时间的两个线程读取i的值保存在cpu cache中,经过运算后再写入内存,但i再经过两次自增后,最后写入内存的值还有可能是2。

为了解决这个问题,通常有两种办法:加锁的方式

缓存一致性协议

第一种方式是一种悲观的方式,只有一个cpu能抢到锁进行运算,而其他cpu就进入阻塞状态。这种方式的效率低下,所以就有了第二种方式。

缓存一致性协议的大致思想是:

如果cpu在操作数据的时候,发现数据是一个共享变量(其他cache也保存了副本),就进行如下操作:读取操作:不做任何处理,只是将cache的数据读取到寄存器。

写入操作:发送一个信号通知其他cpu这个变量我已经改过了,设置为无效变量,其他cpu在进行操作的时候就不得不重新读取一次数据再进行操作。

java 缓存一致性_Java多线程——CPU缓存原理和缓存一致性问题相关推荐

  1. java volatile 死锁_Java 多线程:volatile 变量、happens-before 关系及内存一致性

    原标题:Java 多线程:volatile 变量.happens-before 关系及内存一致性 来源:ImportNew - paddx 更新 请参考来自 Jean-philippe Bempel ...

  2. java线程钥匙_Java多线程并发编程/锁的理解

    一.前言 最近项目遇到多线程并发的情景(并发抢单&恢复库存并行),代码在正常情况下运行没有什么问题,在高并发压测下会出现:库存超发/总库存与sku库存对不上等各种问题. 在运用了 限流/加锁等 ...

  3. java线程池_Java多线程并发:线程基本方法+线程池原理+阻塞队列原理技术分享...

    线程基本方法有哪些? 线程相关的基本方法有 wait,notify,notifyAll,sleep,join,yield 等. 线程等待(wait) 调用该方法的线程进入 WAITING 状态,只有等 ...

  4. java 分布式 redis缓存技术_JAVA架构师系列课程分布式缓存技术Redis权威指南,资源教程下载...

    课程名称 JAVA架构师系列课程分布式缓存技术Redis权威指南,资源教程下载 课程目标 本课程从0基础开始,对redis的方方面面进行细粒度的讲解:包括基础操作.高级命令.各种集群模式.动态增减节点 ...

  5. java 线程由浅入深_Java多线程:由浅入深看synchronized的底层实现原理

    Java多线程:由浅入深看synchronized的底层实现原理-1.jpg (91.72 KB, 下载次数: 0) 2018-9-21 03:55 上传 前言 前俩篇文章,我们聊了聊线程/进程的概念 ...

  6. java 同步锁_Java多线程:synchronized同步锁的使用和实现原理

    作用和用法 在多线程对共享资源进行并发访问方面,JDK提供了synchronized关键字来进行线程同步,实现多线程并发访问的线程安全.synchronized的作用主要体现在三个方面:(1)确保线程 ...

  7. java thread类_Java多线程原理及Thread类详解

    多线程原理 代码如下: 自定义线程类: 测试类: 流程图: 程序启动运行main时候,java虚拟机启动一个进程,主线程main在main()调用时候被创建.随着调用mt的对象的start方法,另外一 ...

  8. java 线程组和线程_Java多线程 线程组原理及实例详解

    线程组 线程组可以批量管理线程和线程组对象. 一级关联 例子如下,建立一级关联. public class MyThread43 implements Runnable{ public void ru ...

  9. java final 实例_Java中final实现原理的深入分析(附示例)

    本篇文章给大家带来的内容是关于Java中final实现原理的深入分析(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. final在Java中是一个保留的关键字,可以声明成员变 ...

最新文章

  1. indesign如何画弧线_硬币画警车简笔画【图文+视频教程】
  2. 小程序之 转发/分享
  3. leetcode算法题--二叉搜索树与双向链表
  4. 微软10亿美元投资AI公司助力云计算,研发通用人工智能
  5. 47 求1+2+3+4+...+n
  6. C/C++ 之 C发展史及 各标准特性说明
  7. [4]Telerik Grid 简单使用方法
  8. 开发简化版NgFor
  9. 制作 小 linux 教程,【NanoPi NEO Plus2开发板试用体验】编译uboot和linux制作最小根文件系统制作刷机包---详细教程...
  10. 勘误:EOS资源抵押退还
  11. 米家zigbee传感器抓包_智能家居最后的瓶颈终于打通,小米米家智能多模网关发布,一顶三...
  12. Pandas 文本数据方法 get( )
  13. java对redis的基本操作(初识)
  14. graphx 基础算法
  15. Java 日志管理最佳实践
  16. 注册微服务到Eureka Service
  17. 如何在博途精智面板及WinCC RT ADV中创建面板
  18. [Unity]Curvy插件随机生成装饰物
  19. 作为老师的一些思考(二)
  20. 用数组实现一个栈结构

热门文章

  1. 演讲预告:一个月的住院经历,我悟到了哪些和程序员职场发展相关的心得
  2. Angular如何自定义attribute指令
  3. Angular workspace默认的packages
  4. How is SAP CDS metadata retrieved from AG3 backend
  5. GM6 1.38.1 start up debug - share memory
  6. CRM呼叫中心toolbar的cancel按钮会导致session清理
  7. 如何在Marketing Cloud Launchpad里打开外部链接
  8. root cause of message type unknown during BP delta upload
  9. IBASE header change - read access sequence
  10. 删除context node后遗留的问题