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

网站APP推广让手机变流畅的软件下载

网站APP推广,让手机变流畅的软件下载,设计之家广告设计,外包兼职平台我们通过volatile解决了由于编译器的指令重排序导致的可见性问题,这意味着volatile 底层用到了内存屏障,下面我们从它的部分源码中找一下内存屏障相关的痕迹。 通过javap-V VolatileExample.class打印VolatileExample类的字节指令如下。 public static …

        我们通过volatile解决了由于编译器的指令重排序导致的可见性问题,这意味着volatile 底层用到了内存屏障,下面我们从它的部分源码中找一下内存屏障相关的痕迹。
通过javap-V VolatileExample.class打印VolatileExample类的字节指令如下。

public static volatile boolean stop;descriptor: zflags:ACC_PUBLIC,ACC_STATIC,ACC_VOLATILE


        我们可以看到修饰了volatile关键字的属性,多了一个ACC_VOLATILE的flag。这个指令会通过字节码解释器来执行,定位到Hotspot源码的bytecodeInterpreter.cpp文件,找到_putstatic 指令的解析代码。
        静态变量的获取和赋值分别通过getstatic和putstatic指令来实现,非静态变量通过getfield 和 putfield 指令来操作stop字段代码如下:

CASE(_putstatic):
//省略部分代码
int field_offset = cache->f2_as_index(); 
if (cache->is_volatile()) {if (tos_type == itos) {obj->release_int_field_put(field_offset,STACK_INT(-1));} else if (tos_type -= atos){VERIFY_OOP(STACK_OBJECT(-1));obj->release_obj_field_put(field_offset,STACK_OBJECT(-1));                 OrderAccess::release_store(&BYTE_MAP_BASE[(uintptr_t)obj >> CardTableModRefBS::card_shift],0);}//省略部分代码OrderAccess::storeload();//省略部分代码
}

上面代码表示,如果当前字段采用volatile 修饰,即 cache->is_volatile(),则根据当前字段类型调用不同的方法进行赋值。

bool is_volatile    () const    { return (_flags & JVM_ACC_VOLATILE)!=0;}    

        在完成stop字段的赋值之后,代码调用了OrderAccess::storeload()内存屏障方法,会基于lock指令来实现内存屏障。
        回到某篇文章中演示VolatileExample可见性问题的代码。

public class VolatileExample {public volatile static boolean stop=false;public static void main(String[] args) throws InterruptedException {Thread t1=new Thread(()->{int i=0;while(!stop){ //此时t1 线程来加载stop的值,由于当前CPU的缓存行stop已经失效,
所以从main线程的缓存行加载或者直接从内存中加载。i++;});t1.start();System.out.println("begin start thread" ); Thread.sleep(1000); stop=true;//StoreLoad();//相当于在这里增加了一个内存屏障,该屏障把stop刷新到缓存行}
}

上述代码中,对stop增加了volatile关键字之后能够保证可见性的原因是:

  • volatile关键字会在JVM层面声明一个C++的volatile,它能够防止JIT层面的指令重排序。
  • 在对修饰了 volatile关键字的stop字段赋值后,JVM会调用storeload()内存屏障方法,该方法中声明了lock指令,该指令有两个作用。

        在CPU层面,给stop赋值的指令会先存储到Store Buffers中,所以lock 指令会使得Store Buffers 中的数据刷新到缓存行。

        使得其他CPU 中缓存了stop 的缓存行失效,也就是让存储在Invalidate Queues 中的对 stop 失效的指令立即生效。


        当其他线程再去读取stop 的值时,会从内存中或者其他缓存了stop字段的缓存行中重新加载,使得线程能够获得 stop 的最新的值。

http://www.hotlads.com/news/3103.html

相关文章:

  • ui的设计网站百度seo推广工具
  • 阿里云ecs 怎么做网站域名交易中心
  • 四川做网站公司哪家好个人网站免费域名注册
  • 做食物的网站中央新闻直播今天
  • 开发公司安全管理制度seo软文推广
  • 大型网站seo方案网上引流推广怎么做
  • wordpress文章生成html代码石家庄seo外包的公司
  • 协会网站建设搜索引擎竞价推广的优势
  • 宝安建网站免费精准客源
  • wordpress xml插件下载上海seo网站优化
  • 企业网站做的漂亮淘宝店铺如何推广
  • 如何免费做一个网站攻略住房和城乡建设部官网
  • 浙江住房城乡与建设委员会网站查新闻稿在线
  • 品牌搜索引擎服务优化seo如何快速排名百度首页
  • 企业宣传片拍摄思路seo引擎搜索
  • 零售网站制作seo关键词优化推广报价表
  • 校园网站建设依据app运营方案
  • 房山企业网站建设公司2020国内搜索引擎排行榜
  • 呼市网站建设公司百度推广服务费一年多少钱
  • 合肥网络运营公司哪家好手机优化大师为什么扣钱
  • 网站排版的优点seo关键词排名报价
  • 卖狗做网站什么关键词最好开鲁网站seo站长工具
  • django可以做多大的网站宁波免费建站seo排名
  • wordpress显示作者信息重庆百度seo整站优化
  • 小程序开发者关键词优化一般收费价格
  • 沈阳高端网站定制开发学管理培训班去哪里学
  • 天津市网站制作 公司app推广软件有哪些
  • 做网站跳转百度快速排名点击器
  • 杭州专业做网站的淘宝代运营靠谱吗
  • 网站建设动图代码学历提升哪个教育机构好一些