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

企业手机网站建设市场分析网页设计框架

企业手机网站建设市场分析,网页设计框架,郑州公司建设网站,微信微网站是什么目录 一,内存屏障1,概念2,内存屏障的效果3,cpu中的内存屏障 二,JVM中提供的四类内存屏障指令三,volatile 特性1,保证内存可见性定义2,禁止指令重排序3,不保证原子性 一&a…

目录

  • 一,内存屏障
    • 1,概念
    • 2,内存屏障的效果
    • 3,cpu中的内存屏障
  • 二,JVM中提供的四类内存屏障指令
  • 三,volatile 特性
    • 1,保证内存可见性定义
    • 2,禁止指令重排序
    • 3,不保证原子性

一,内存屏障

1,概念

内存屏障是硬件之上、操作系统或JVM之下,对并发作出的最后一层支持。再向下是是硬件提供的支持;向上是操作系统或JVM对内存屏障作出的各种封装。内存屏障是一种标准,各厂商可能采用不同的实现

2,内存屏障的效果

即使指令的执行没有重排序,是按顺序执行的,但由于缓存的存在,仍然会出现数据的非一致性的情况。我们把这种普通读``普通写可以理解为是有延迟的延迟读、延迟写,因此即使读在前、写在后,因为有延迟,然后仍然会出现写在前、读在后的情况。
为了解决上述重排带来的问题,提出了as-if-serial原则,即不管怎么重排序,程序执行的结果在单线程里保持不变。为了遵守as-if-serial原则,我们需要一种特殊的指令来阻止特定的重排,使其保持结果一致,这种指令就是内存屏障。

内存屏障有两个效果:

  • 阻止指令重排序:在插入内存屏障指令后,不管前面与后面任何指令,都不能与内存屏障指令进行重排,保证前后的指令按顺序执行,即保证了顺序性。
  • 全局可见:插入的内存屏障,保证了其对内存操作的读写结果会立即写入内存,并对其他CPU核可见,即保证了可见性,解决了普通读写的延迟问题。例如,插入读屏障后,能够删除缓存,后续的读能够立刻读到内存中最新数据(至少当时看起来是最新)。插入写屏障后,能够立刻将缓存中的数据刷新入内存中,使其对其他CPU核可见。

3,cpu中的内存屏障

lfence:读屏障(load fence),即立刻让CPU Cache失效,从内存中读取数据,并装载入Cache中。
sfence: 写屏障(write fence), 即立刻进行flush,把缓存中的数据刷入内存中。
mfence: 全屏障 (memory fence),即读写屏障,保证读写都串行化,确保数据都写入内存并清除缓存。

二,JVM中提供的四类内存屏障指令

loadload:
读读
,该屏障用来禁止处理器把上面的volatile读与下面的普通读重排序
storestore:
写写
,该屏障可以保证在volatile写之前,其前面的所有普通写操作都已经刷新到主内存中
loadstore:
读写
,该屏障用来禁止处理器把上面的volatile读与下面的普通写重排序
storeload:
写读
,该屏障的作用是避免volatile与后面可能有的volatile读/写操作重排序

三,volatile 特性

1,保证内存可见性定义

(1)定义:
可见性的定义常见于各种并发场景中,以多线程为例:当一个线程修改了线程共享变量的值,其它线程能够立即得知这个修改。
从性能角度考虑,没有必要在修改后就立即同步修改的值——如果多次修改后才使用,那么只需要最后一次同步即可,在这之前的同步都是性能浪费。因此,实际的可见性定义要弱一些,只需要保证:当一个线程修改了线程共享变量的值,其它线程在使用前,能够得到最新的修改值。
(2)如何保证可见性
Java内存模型中定义的8种工作内存与主内存之间的原子操作
在这里插入图片描述

  • read: 作用于主内存,将变量的值从主内存传输到工作内存,主内存到工作内存
  • load: 作用于工作内存,将read从主内存传输的变量值放入工作内存变量副本中,即数据加载
  • use: 作用于工作内存,将工作内存变量副本的值传递给执行引擎,每当JVM遇到需要该变量的字节码指令时会执行该操作
  • assign: 作用于工作内存,将从执行引擎接收到的值赋值给工作内存变量,每当JVM遇到一个给变量赋值字节码指令时会执行该操作
  • store: 作用于工作内存,将赋值完毕的工作变量的值写回给主内存
  • write: 作用于主内存,将store传输过来的变量值赋值给主内存中的变量
    由于上述只能保证单条指令的原子性,针对多条指令的组合性原子保证,没有大面积加锁,所以,JVM提供了另外两个原子指令:
  • lock: 作用于主内存,将一个变量标记为一个线程独占的状态,只是写时候加锁,就只是锁了写变量的过程。
  • unlock: 作用于主内存,把一个处于锁定状态的变量释放,然后才能被其他线程占用

2,禁止指令重排序

(1)定义
重排序并没有严格的定义。整体上可以分为两种:
真·重排序:编译器、底层硬件(CPU等)出于“优化”的目的,按照某种规则将指令重新排序(尽管有时候看起来像乱序)。
伪·重排序:由于缓存同步顺序等问题,看起来指令被重排序了。
(2)问题来源
重排序问题无时无刻不在发生,源自三种场景:

  • 编译器编译时的优化
  • 处理器执行时的乱序优化
  • 缓存同步顺序(导致可见性问题)
    场景1、2属于真·重排序;场景3属于伪·重排序。场景3也属于可见性问题

(3)怎么禁止指令重排序

volatile有关禁止指令重排的行为
当第一个操作是 volatile 读时,不论第二个操作是什么,都不能重排序;这个操作保证了volatile读之后的操作不会被重排到volatile读之前
当第二个操作为 volatile 写时,不论第一个操作是什么,都不能重排序;这个操作保证了volatile写之前的操作不会被重排到volatile写之后
当第一个操作为 volatile 写时,第二个操作为 volatile 读时,不能重排序

3,不保证原子性

volatile变量的复合操作(如i++)是不具有原子性的,原因是 i++ 操作从字节码角度来看,是分为三步的
在这里插入图片描述
多线程环境下,数据计算和数据赋值操作可能多次出现,即操作非原子。若数据再加载之后,若主内存中 count变量发生修改之后,由于线程工作内存中的值在此之前已经加载,从而不会对变更操作做出相应变化,即私有内存和公共内存中变量不同步,进而导致数据不一致
对于volatile变量,JVM只是保证从主内存加载到线程工作内存的值是最新的,也就是数据加载时是最新的。

http://www.tj-hxxt.cn/news/15289.html

相关文章:

  • 海南中小企业网站建设网络软文范文
  • 慧聪网郭凡生谷歌seo建站
  • 一般做外单的有哪些网站友情贴吧
  • 一般做外贸上什么网站好网络营销推广主要做什么?
  • 惠州中小企业网站制作北京百度总部电话
  • 怎么做网站作业天猫代运营
  • 抽奖小程序制作常熟seo网站优化软件
  • 网站seo外包价格搜索seo优化托管
  • 网站开发工程师职业道德今日最新国际新闻头条
  • 专门做消防器材的网站微信群拉人的营销方法
  • 深圳市建设交易中心网站和生活app下载安装最新版
  • 网站拍照的幕布国外免费网站建设
  • 厦门做网站的公司网站推广上首页
  • 新开传奇网站刚开一秒营销策略4p分析怎么写
  • 电影网站做淘客怎么注册百度账号
  • 源码下载网站源码nba湖人最新新闻
  • 织梦网站错位提高网站搜索排名
  • 重庆房产网站建设推广方案模板
  • 中山古镇做网站淘数据官网
  • 衢州高级网站设计百度手机助手免费下载
  • 企业微信开通流程石家庄自动seo
  • 企业网站备案建设方案策划书在线网页制作网站
  • 天津网站制作南昌合肥网站关键词优化公司
  • 教育类企业网站磁力搜索器
  • 网站建设推广是什么意思在线咨询
  • 深圳专业网站设计制作线上营销课程
  • 云南专业网站建设网络营销的三大基础
  • 程序员能转行做网站维护不百度做个人简介多少钱
  • 网站不能访问如何做冗余网站查询是否安全
  • 求一个做烧肉的网站网站推广什么意思