当前位置: 首页 > news >正文

为代理网站做网站十大垂直电商平台

为代理网站做网站,十大垂直电商平台,建设网站翻译英文,仓储物流网站建设文章目录 Volatile原理1.Volatile语义中的内存屏障1.1.volatile写操作的内存屏障1.1.1.StoreStore 屏障1.1.2.StoreLoad 屏障 1.2.volatile读操作的内存屏障1.2.1.LoadStore屏障1.2.2.LoadLoad屏障 2.volatile不具备原子性2.1.原理 Volatile原理 1.Volatile语义中的内存屏障 在… 文章目录 Volatile原理1.Volatile语义中的内存屏障1.1.volatile写操作的内存屏障1.1.1.StoreStore 屏障1.1.2.StoreLoad 屏障 1.2.volatile读操作的内存屏障1.2.1.LoadStore屏障1.2.2.LoadLoad屏障 2.volatile不具备原子性2.1.原理 Volatile原理 1.Volatile语义中的内存屏障 在Java代码中volatile关键字主要又两层语义 不同线程对volatile变量的值具有内存可见性就是一个线程修改了某个volatile变量的值该值对其他线程立即可见。禁止指令重排序 同时volatile关键字不仅能保证可见性还能保证有序性保证有序性是通过内存屏障指令来确保的。 JVM编译器会在生成字节码文件时会在指令序列中插入内存屏障来禁止特定类型的CPU重排序。 JVM在处理volatile关键字修饰的变量时会采取保守策略来确保内存可见性和有序性这涉及到内存屏障Memory Barrier的使用。内存屏障是一种硬件层面的指令用于确保某些内存访问操作的执行顺序防止CPU的乱序执行对并发程序的正确性产生影响。对于volatile变量的读写JVM会分别在读和写操作前后插入适当类型的内存屏障确保以下几点 全局可见性: 保证对volatile变量的写操作能立即对其他线程可见即使在不同的CPU缓存中也是如此。这意味着写操作之后修改的值会立刻刷出到主内存中。禁止重排序: 防止编译器和CPU对涉及volatile变量的代码进行不必要的重排序确保它们按照程序员指定的顺序执行。这对于依赖于特定顺序的并发控制逻辑至关重要。 基于保守策略的volatile操作内存屏障插入策略主要包括以下方面 写屏障Store Memory Barrier: 在写入volatile变量之后插入。它的作用是确保在该屏障之前的所有普通写操作非volatile都已完成并且将当前线程的工作内存中的volatile变量值刷新到主内存中。这样任何读取该volatile变量的线程都能看到最新值。 在每个volatile写操作前面插入一个StoreStore屏障在每个volatile写操作后面插入一个 StoreLoad屏障 读屏障Load Memory Barrier: 在读取volatile变量之前插入。它的作用是确保读取操作之后的加载不会被重排序到该屏障之前并且使CPU读取主内存中的最新值而不是使用缓存中的旧值从而确保读取到的是最近一次写入的值无论这个写入操作发生在哪个线程中。 在每个volatile读操作前面插入一个LoadLoad屏障在每个volatile读操作后面插入一个 LoadStore屏障 这些屏障的联合使用确保了对volatile变量的读写操作具有原子性和全局有序性尽管它们不保证复合操作如count的原子性。这就是为什么即使在没有锁的情况下volatile也能作为轻量级的同步机制用于状态标记、双重检查锁定模式等场景。 1.1.volatile写操作的内存屏障 volatile写操作的内存屏障插入策略为在每个volatile写操作前插入SotreStore(SS)屏障在写操作之后加上StoreLoad屏障 1.1.1.StoreStore 屏障 定义与作用 StoreStore屏障主要用于确保一个存储写操作在另一个存储操作之前完成。换句话说它强制所有在该屏障之前的存储操作在该屏障之后的存储操作之前完成。这种屏障通常用于避免写-写冲突导致的数据不一致问题尤其是在处理器有乱序执行能力的体系结构中。 前面的写入不会重排序到后面前面的写指令完成后高速缓存数据刷入主存后面的写操作不会排序到前面 应用场景 例如在实现某些类型的锁释放操作时可能需要确保解锁操作前的所有写操作已经完成以免新获得锁的线程看到不一致的状态。 1.1.2.StoreLoad 屏障 定义与作用 StoreLoad屏障是Java内存模型中最强大的一种屏障它确保在屏障之前的所有写操作存储操作在屏障之后的任何读操作加载操作之前完成。这意味着不仅要求写操作完成而且要确保这些写操作对所有线程可见。因此StoreLoad屏障通常用于实现volatile变量的写操作后以确保写入的值对其他线程立即可见。 前面的写不会重排序到后面前面的写指令操作完成后高速缓存数据立即刷入主存让高速缓存的数据失效重新从主存中加载数据保证内核的高速缓存数据一致后面的读操作不会重排序到前面 应用场景 StoreLoad屏障直接关联于Java中volatile字段的写操作实现。当一个线程修改了一个volatile变量的值JVM会在写操作之后插入一个StoreLoad屏障以确保该写入的值能够立即对其他线程可见同时刷新处理器的缓存避免数据的脏读。此外它也常用于锁释放操作后的内存可见性保障确保解锁前的内存更改对后续可能获得锁的线程是可见的。 总结来说StoreStore屏障关注于维持存储操作之间的顺序而StoreLoad屏障则进一步确保了写操作的全局可见性并在写-读操作间建立了一个顺序关系这对于维护多线程程序的一致性和正确性至关重要。 1.2.volatile读操作的内存屏障 volatile读操作的内存屏障插入策略为在每个volatile读操作后面插入LoadLoad(LL)屏障和LoadStore屏障禁止后面的普通读、普通写、和前面的volatile读操作发生重排序 1.2.1.LoadStore屏障 定义与功能 LoadStore屏障也称为读写屏障其主要作用是确保屏障之后的读操作不会被重排序到屏障之前且屏障之后的写操作不会被重排序到屏障之前的读操作之前。这意味着它不仅确保了读操作不会提前还阻止了读之后的写操作与读操作之前的任何写操作发生乱序。这在volatile读操作的上下文中意味着确保了读取到的volatile变量的值不会被之后的写操作所覆盖或影响保持了读取操作的确定性。 前面的读操作不会排到后面让高速缓存中的数据失效重新从主存中加载数据后面的写操作不会排列到前面 在volatile读操作中的应用 当执行volatile读操作时Java虚拟机JVM会在读取操作之后插入一个LoadStore屏障。这个屏障的目的是确保当前线程的任何后续写操作不会与刚完成的volatile读操作交错保证了volatile读的值不会因为之后的写而变得无效或不一致。同时这也间接帮助确保了volatile读取操作后的写操作不会与之前的volatile读操作或普通读操作发生冲突维护了操作的顺序性。 1.2.2.LoadLoad屏障 定义与功能 LoadLoad屏障或称为读读屏障它的主要职责是防止屏障之后的读操作被重排序到屏障之前的任何读操作之前。这意味着它确保了在屏障之后执行的任何读操作不会因为CPU的乱序执行优化而提前到屏障之前执行。尽管LoadLoad屏障本身在某些JMM的描述中不常直接提及但讨论内存屏障时其概念往往隐含在维护读操作顺序性的讨论中。 前面的读操作不会被排到后面让高速缓存中的数据失效重新从主存中加载数据后面读操作不会排列到前面 在volatile读操作中的应用 虽然直接提及LoadLoad屏障在volatile读操作后插入的情况较少见通常强调的是LoadStore和StoreLoad屏障的作用但理解其概念对于全面把握内存屏障如何维护顺序性是有帮助的。在volatile读操作的上下文中可以抽象理解为屏障的逻辑效果确保了读取volatile变量的值不会被之后的其他读取操作提前保证了读取volatile变量的顺序性。不过实际中volatile读操作的关键在于通过StoreLoad屏障确保了对其他线程写入volatile变量的值立即可见同时防止了volatile读与普通读写操作的不恰当重排序。 2.volatile不具备原子性 volatile能保证数据的可见性但是volatile并不能完全保证数据的原子性。对于volatile类型的变量进行符合操作例如i,仍然会存在线程不安全的问题 /*** 使用 10个线程每个线程进行1000次 操作来观察成员变量的结果是否符合我们的预期*/ public class VolatileAddDemo {private volatile int num 0;TestDisplayName(测试并发情况下 volatile原子性)public void testVolatileAdd() {CountDownLatch latch new CountDownLatch(10);ExecutorService executorService Executors.newFixedThreadPool(10);for (int i 0; i 10; i) {executorService.submit(() - {for (int j 0; j 1000; j) {num;}// 每次执行完毕 -1latch.countDown();});}// 等待全部线程执行完毕try {latch.await();} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(最终的结果 num);System.out.println(预期的结果10000);System.out.println(相差 (10000 - num));}}2.1.原理 首先来看一下JMM对变量进行读取和写入的操作流程 对于非volatile修饰的普通变量来说在读取变量的时候JMM要求需要 报纸read、load的顺序即可 但是从主存中读取 x 、y 两个变量的值可能的操作是 read x - read y - load y - load x它并不要求操作是连续的 对于关键字 volatile修饰的内存可见变量而言具有两个重要的语义 使用volatile修饰的变量在变量值发生改变时会立即同步到主存并且让其他线程的变量副本失效禁止指令重排序用volatile修饰的变量在硬件层面上会通过在指令前后加入内存屏障来实现编译器通过以下规则来进行实现的。 使用volatile修饰的变量 **read(读取),load(加载),use(使用)**都是连续出现的所以每次使用变量时都要从主存读取最新的变量值替换私有内存的变量副本值对于同一个变量的**assign(赋值),store(存储),write(主存)**操作都是连续出现所以每次对变量的修改都会立即同步到主存中 但是思考一下单线程下** read,load,useassign,store,write**同时出现没什么问题但是在多线程并发执行的情况下因为单个操作具备原子性但是多个组合的话就不具备原子性了还是有可能会出现脏数据。 下面通过图来了解一下 并发时可能发生产生脏数据的场景 对于复合操作volatile变量是无法保证其原子性的如果想要保证复合操作的原子性那么就需要使用锁并在在高并发场景下volatile变量一定要和Java显示锁结合使用 这里补充介绍一下 JMM内存模型的 8个 操作 操作描述作用的对象read读取把一个变量的值从主内存或高速缓存读到线程的工作内存中准备下一步的load操作load加载入把read操作从主内存读取的变量值放入线程的工作内存中的变量副本中此时变量才对线程可见use使用把工作内存中变量的值传递给执行引擎作为运算的输入assign赋值把执行引擎计算出的结果赋值给工作内存中的变量store存储把工作内存中修改后的变量值写回到主内存中write写出把store操作从工作内存中变量的值写入到主内存使得其他线程可见lock加锁作用于主内存的变量标记变量为线程独占确保同一时刻只有一个线程能执行lock和unlock之间的操作unlock解锁释放锁作用于主内存的变量允许其他线程获取该变量的锁并进行操作
http://www.w-s-a.com/news/968346/

相关文章:

  • 免费的网站加速器注册公司邮箱
  • 千助网站建设网站整站程序
  • 自学建网站做网站优化访问网站出现目录
  • 济南网站建设是什么百度官网登录入口手机版
  • net快速建站西宁手机网站建设
  • 网站浏览器不兼容怎么办软件系统开发大概多少钱
  • 网站建设哪个公司最好shift wordpress
  • 公司网站建设功能介绍室内设计学习
  • 做网站策划容易遇到哪些问题沈阳公司网站制作
  • 做php网站都用框架吗网站备案当面核验拍摄照片
  • 泉州企业自助建站兰州最好的互联网公司
  • 监察部门网站建设方案网站seo技术教程
  • 个人网站制作源代码下载品牌建设部
  • 网站备案需要准备什么文创产品设计思路
  • 网站开发书籍推荐青岛城阳新闻最新消息
  • 秦皇岛网站建设服务聊城做网站的公司资讯
  • 30岁转行做网站设计丰涵网站建设
  • 山东省和住房建设厅网站首页开发商不按时交房可以退房吗
  • asp网站怎么做404页面跳转本地南通网站建设
  • 点击网站出现微信二维码的链接怎么做申请网站空间怎么做
  • 网站开发的论文题目广告设计排行榜
  • 网络营销网站 功能南京h5制作公司
  • 做网站的费用的会计分录合肥做网站推广哪家好
  • 电子商城网站开发怎么wordpress用的什么主题
  • 榆林电商网站建设网上做试卷的网站
  • 文山网站建设代理中公教育培训机构官网
  • 郑州it培训机构有哪些上海外贸网站seo
  • dw做网站的实用特效广东住房与城乡建设厅网站
  • 模板网站 动易哪方面的网站
  • 怎么给网站做外链邵连虎郑州做网页的公司