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

律所网站建设要求书定制网站开发的意思

律所网站建设要求书,定制网站开发的意思,救护车网站找谁做,wordpress中文留言板目录1. 面试题一#xff1a;谈谈 volatile 的使用及其原理补充#xff1a;内存屏障volatile 的原理2. 面试题二#xff1a;volatile 为什么不能保证原子性3. 面试题三#xff1a;volatile 的内存语义4. 面试题四#xff1a;volatile 的实现机制5. 面试题五#xff1a;vol… 目录1. 面试题一谈谈 volatile 的使用及其原理补充内存屏障volatile 的原理2. 面试题二volatile 为什么不能保证原子性3. 面试题三volatile 的内存语义4. 面试题四volatile 的实现机制5. 面试题五volatile 与锁的对比1. 面试题一谈谈 volatile 的使用及其原理 volatile 关键字是用来保证有序性和可见性的。 我们所写的代码不一定是按照我们自己书写的顺序来执行的编译器会做重排序CPU 也会做重排序的这样做是为了了减少流水线阻塞提高 CPU 的执行效率。这就需要有一定的顺序和规则来保证不然程序员自己写的代码都不不知道对不对了所以有 happens-before 规则。 其中有条就是 volatile 变量规则对一个变量的写操作先行发生于后面对这个变量的读操作、有序性实现的是通过插入内存屏障来保证的。 被 volatile 修饰的共享变量量就具有了以下两点特性 保证了不同线程对该变量操作的内存可见性;禁止指令重排序。 补充内存屏障 从 CPU 层面来了解一下什么是内存屏障。 CPU 的乱序执行本质还是 CPU 多核心、CPU 高速缓存。存在多个缓存的时候就必须通过缓存一致性协议MESI来避免数据不一致的问题而这个通讯的过程就可能导致乱序访问的问题也就是运行时的内存乱序访问。 现在的 CPU 架构都提供了内存屏障功能在 x86 的 CPU 中实现了相应的内存屏障写屏障Store Barrier、读屏障Load Barrier和全屏障Full Barrier主要的作用是 防止指令之间的重排序保证数据的可见性。 volatile 的原理 在 JVM 底层 volatile 是采用「内存屏障」来实现的。当我们观察加入 volatile 关键字和没有加入 volatile 关键字时所生成的汇编代码会发现加入 volatile 关键字时会多出一个 lock 前缀指令lock 前缀指令实际上相当于一个内存屏障内存屏障会提供三个功能 它确保指令重排序时不会把其后面的指令排到内存屏障之前的位置也不会把前面的指令排到内存屏障的后面即在执行到内存屏障这句指令时在它前面的操作已经全部完成它会强制将对缓存的修改操作立即写入主存如果是写操作它会导致其他CPU中对应的缓存行无效。 会引发两件事情 将当前处理器缓存行的数据写回到系统内存这个写回内存的操作会使得在其他处理器缓存了该内存地址无效 什么意思呢意思就是说当一个共享变量被 volatile 修饰时它会保证修改的值会立即被更新到主存当有其他线程需要读取时它会去内存中读取新值这就保证了可见性。 2. 面试题二volatile 为什么不能保证原子性 一个变量 i 被 volatile 修饰两个线程想对这个变量修改都对其进行自增操作也就是 ii 的过程可以分为三步首先获取 i 的值其次对 i 的值进行加1最后将得到的新值写会到缓存中。 线程 A 首先得到了 i 的初始值100但是还没来得及修改就阻塞了这时线程 B 开始了它也得到了 i 的值由于 i 的值未被修改即使是被 volatile 修饰主存的变量还没变化那么线程 B 得到的值也是100之后对其进行加 1 操作得到101后将新值写入到缓存中再刷入主存中。根据可见性的原则这个主存的值可以被其他线程可见。 问题来了线程 A 已经读取到了 i 的值为100也就是说读取的这个原子操作已经结束了所以这个可见性来的有点晚线程 A 阻塞结束后继续将 100 这个值加 1得到101再将值写到缓存最后刷入主存所以即便是 volatile 具有可见性也不能保证对它修饰的变量具有原子性。 测试案例 /*** 实体类观察num值的可见性此时没有volatile*/ class Volatile {// volatile int num 0; 加上volatile关键字int num 0; // 不加volatile关键字public void addTo60() {this.num 60;} }//测试类 public class test {public static void main(String[] args) {//测试可见性seeVolatileOk();}/*** aaa线程修改num值为60后main线程拿到的num0死循环。说明线程之间共享变量不可见。*/private static void seeVolatileOk() {Volatile v new Volatile();new Thread(() - {System.out.println(Thread.currentThread().getName() \t come in );try {TimeUnit.SECONDS.sleep(2);} catch (InterruptedException e) {e.printStackTrace();}v.addTo60();System.out.println(Thread.currentThread().getName() \t updated num value: v.num);}, aaa).start();while (v.num0){}System.out.println(Thread.currentThread().getName() \t mission is over,updated num value: v.num);} }3. 面试题三volatile 的内存语义 写内存语义当写一个 volatile 变量时JMM 会把该线程本地内存中的共享变量的值刷新到主内存读内存语义当读一个 volatile 变量时JMM 会把该线程本地内存置为无效使其从主内存中读取共享变量。 4. 面试题四volatile 的实现机制 为了实现 volatile 的内存语义编译器在生成字节码时会在指令序列中插入内存屏障来禁止特定类型的处理器重排序。内存屏障插入策略非常保守但它可以保证在任意处理器平台任意的程序中都能得到正确的 volatile 内存语义。 在每个volatile写操作的前面插入一个 StoreStore 屏障在每个volatile写操作的后面插入一个 StoreLoad 屏障在每个volatile读操作的后面插入一个 LoadLoad 屏障在每个volatile读操作的后面插入一个 LoadStore 屏障。 5. 面试题五volatile 与锁的对比 volatile 仅仅保证对单个 volatile 变量的读/写具有原子性而锁的互斥执行的特性可以确保对整个临界区代码的执行具有原子性。在功能上锁比 volatile 更强大在可伸缩性和执行性能上 volatile 更有优势。
http://www.hkea.cn/news/14336002/

相关文章:

  • 哪儿提供邢台做网站沈阳cms建站模板
  • 温州企业网站建设公司wordpress 调用编辑器
  • 肥东县建设局网站网站设计模板免费下载
  • 制作一个公司网站多少wordpress翻书
  • 网站域名被注销wordpress关键词连接插件
  • 货代到哪个网站开发客户温州英文seo
  • 沈阳网站优化怎么做wordpress小说插件
  • 深圳住房宝安和建设局网站58同城类型网站制作
  • 建网站一般要多少钱wordpress 在线检测
  • 网站建设 搜狐号电子商务网站建设感悟
  • 怎样设计网页的首页德州乐陵德州seo公司
  • 大型网站域名西宁解封最新通知
  • 高阳县做企业网站qq手机版在线登录入口
  • 汽修网站建设免费溧阳网页设计
  • 图库网站cms网站模板定制
  • 一站式外贸服务平台网站流量统计表格
  • php wordpress 关系南通百度网站快速优化
  • 怎么查询网站有没备案源码如何搭建网站
  • 做啤酒纸箱包装的网站医药外贸是做什么的
  • 什么是自主设计网站常州网站建设书生商友
  • 万网网站开发wordpress搜索框
  • 卡盟网站开发阿里云网站模板
  • 公司网站主页怎么做免费动漫网站
  • 大二学生做网站难吗百度seo营销推广多少钱
  • 网站更新迭代运营公众号还是做网站
  • 网站交互行为做面食专业网站
  • 手机膜 东莞网站建设东莞常平翔龙天地
  • 长沙创意网站建设网站和搜索引擎
  • 网页游戏网站排行猪八戒小程序开发报价
  • 广州做网站公司电话太原小程序制作电话