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

新乡网站建设策划苏州做网站优化的公司

新乡网站建设策划,苏州做网站优化的公司,做啥网站能挣钱,html编辑器怎么导入图片目录 一、内存可见性 1.1 Java内存模型(JMM) 1.2 内存可见性演示 二、指令重排序 三、关键字 volatile 一、内存可见性 1.1 Java内存模型(JMM) 1#xff09;什么是Java内存模型#xff08;JMM#xff09;#xff1f;Java内存模型即Java Memory Model#xff0c;简…目录 一、内存可见性 1.1 Java内存模型(JMM) 1.2 内存可见性演示 二、指令重排序 三、关键字 volatile  一、内存可见性 1.1 Java内存模型(JMM) 1什么是Java内存模型JMMJava内存模型即Java Memory Model简称JMM。用于屏蔽各种硬件和操作系统的内存访问差异以实现让Java程序在各平台下都能够达到一致的内存访问效果即实现“跨平台”。 2JMM中的“主内存”概念和“工作内存”概念“主内存”硬件中的内存在JMM中表述为“主内存”其中存储了线程间的共享变量等数据。“工作内存”CPU寄存器和缓存等临时存储区在JMM中表述为“工作内存”每个线程都有自己的“工作内存”。 3线程和“主内存”、“工作内存”的关系 当线程需要读取共享变量时会从“主内存”拷贝至“工作内存”再从“工作内存”读取。 当线程需要修改共享变量时会先修改“工作内存”中的数据副本再将数据同步回“主内存”。 线程运行中数据的交互是频繁且持续的而CPU访问自身寄存器和高速缓存的速度远高于访问内存的速度。 因此采用频繁与“工作内存”交互、需要时再与“主内存”交互的工作策略有利于提高运行效率是编译器优化的方式之一。 1.2 内存可见性演示 什么是内存可见性 内存可见性是指线程对共享变量值的修改能否被其他线程及时察觉。 如果一个线程修改了共享变量值但没有及时写回内存中导致其他线程无法获得已修改的正确数据这就被认为出现了线程安全问题。 内存可见性是导致线程不安全的原因之一。 代码演示内存不可见导致线程不安全 public class Volatile_Demo0 {//有一个共享变量flag注意该变量没有被 volatile 修饰public static int flag 0;public static void main(String[] args) throws InterruptedException {//创建一个线程线程中当flag为0时一直循环判断Thread t new Thread(()-{while (flag 0){}});//启动线程System.out.println(run开始);t.start();//让main线程休眠两秒后将flag的值改为1Thread.sleep(2000);flag 1;//让main线程等待t线程结束t.join();System.out.println(run结束);} }//运行结果 run开始 ...程序一直在执行没有打印“run结束”。 出现了线程安全问题。 上述代码问题分析 程序无法结束的原因是什么 根据代码flag 在线程启动两秒后被改为 1 此时 t 线程应该因为跳出 while 循环而执行完毕。 但实际情况却不是这样t 线程没有结束。 正如上文“线程和‘主内存’、‘工作内存’的关系”中提到的线程读取共享数据到“工作内存中”再从“工作内存”读取数据。 所以此时在 t 线程中参与 while 循环条件判断的 flag 实际上是一个存储在“工作内存”的 flag 副本。 当 flag 通过另一线程改变值改变的是“主内存”中的 flagt 线程并不能察觉。 因此 t 线程无法从 while 循环中跳出并结束。 这就是内存可见性影响线程安全的情况之一。 二、指令重排序 1什么是指令重排序 指令重排序是指编译器自动调整原有代码的执行顺序在保证逻辑不变的前提下提高程序运行效率。 指令重排序也是编译器优化的方式之一。 2指令重排序存在什么问题 指令重排序的前提是“保证逻辑不变”。这一点在单线程环境下较容易判断但是在多线程环境下代码复杂程度高编译器在编译阶段对代码执行效果的判断存在困难。 因此在多线程环境下代码重排序很容易导致优化后和优化前的逻辑不等价。 图示演示指令重排序可能出现的问题 三、关键字 volatile  1volatile 的作用是什么1 保证内存可见性。volatile 修饰的变量每次被访问都必须从内存中读取每次被修改都必须存储到内存中。 2禁止指令重排序。volatile 修饰的变量读写操作的相关指令不允许被重排序。 2内存可见性和指令重排序都是编译器优化怎么好像都是负作用 在大部分场景下编译器优化都能非常优秀的提高程序的运行效率只是在多线程编程的部分关键代码中存在线程不安全的风险。 3volatile 不保证原子性volatile 和 synchronized 有本质的区别synchronized 保证原子性而 volatile 保证的是内存可见性。 4合理的使用 volatile 关键字 编译器优化就好像一场激烈的风暴而程序员要做的就是掌控这场风暴必要时让风暴停一停。 为此Java 提供了 volatile 关键字供程序员使用。当使用 volatile 关键字时强制读写内存禁止指令重排序程序运行速度变慢但数据准确性提高线程变得安全了。 代码演示 volatile 的使用效果沿用上文“内存可见性演示”中的代码 public class Volatile_Demo0 {//有一个共享变量flag注意该变量已经被 volatile 修饰public volatile static int flag 0;public static void main(String[] args) throws InterruptedException {//创建一个线程线程中当flag为0时一直循环判断Thread t new Thread(()-{while (flag 0){}});//启动线程System.out.println(run开始);t.start();//让main线程休眠两秒后将flag的值改为1Thread.sleep(2000);flag 1;//让main线程等待t线程结束t.join();System.out.println(run结束);} }//运行结果 run开始 run结束与上文“内存可见性演示”中的代码唯一的不同就是在共享变量 flag 上使用了 volatile 进行修饰。 但这次的结果是程序正常执行完毕证明了 volatile 的作用。
http://www.w-s-a.com/news/421763/

相关文章:

  • 营销型网站的建站步骤是什么意思广州门户网站建设公司
  • 汕尾好网站建设推广计算机软件包含网站开发
  • 建设工程施工许可证在哪个网站办wordpress更换主题白屏
  • 微交易网站建设wordpress摘要调用
  • 做网站维护需要懂什么网站后台后缀名
  • 网站建设的认可桂平市住房和城乡建设局网站
  • 网站设计师岗位职责域名关键词查询
  • 百度怎样建设网站盐城公司网站建设
  • 站长工具国产2023网站制作 商务
  • 网络新闻专题做的最好的网站杭州网站设计建设公司
  • 电商网站界面设计流程ps培训班一般学费多少钱
  • 西安网站运营上海闵行区网站制作公司
  • 宁波网站推广代运营长链接转化成短链接工具
  • 小企业如何建网站怎么自己制作app
  • 苏州品牌网站制作公司宁波建设工程有限公司
  • 合肥网站建设zgkr互联网创业好项目
  • 哪里学网站建设与管理云落wordpress
  • 网站建设意见做网站涉及到哪些
  • 网站导航栏原型图怎么做怎么样创建一个网站
  • 遨游建站金融网站建站
  • cms企业网站模板上海网站开发平台
  • 贵阳网站建设搜q479185700网站团队建设
  • 电商网站建设 教学总结蚌埠市住房建设部网站
  • 深圳罗湖企业网站发稿类别是什么
  • 做网站基本语言企业应用软件开发
  • 网站建设与运营 市场分析影视小程序搭建
  • vs 团队网站开发中铁建设门户网登录咋进不去了
  • 快速网站建设公司哪家好优秀的网站建设
  • 网站开发的自适应wordpress搜索词结果按文章标题
  • 微网站是用什么开发的wordpress中英文主题