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

潍坊网站建设自助建站平台公司注册网站方法

潍坊网站建设自助建站平台,公司注册网站方法,什么是ui设计图,当铺网站建设方案转载自 再有人问你volatile是什么#xff0c;就把这篇文章发给他 在再有人问你Java内存模型是什么#xff0c;就把这篇文章发给他中我们曾经介绍过#xff0c;Java语言为了解决并发编程中存在的原子性、可见性和有序性问题#xff0c;提供了一系列和并发处理相关的关键字…转载自  再有人问你volatile是什么就把这篇文章发给他 在再有人问你Java内存模型是什么就把这篇文章发给他中我们曾经介绍过Java语言为了解决并发编程中存在的原子性、可见性和有序性问题提供了一系列和并发处理相关的关键字比如synchronized、volatile、final、concurren包等。在前一篇文章中我们也介绍了synchronized的用法及原理。本文来分析一下另外一个关键字——volatile。 本文就围绕volatile展开主要介绍volatile的用法、volatile的原理以及volatile是如何提供可见性和有序性保障的等。 volatile这个关键字不仅仅在Java语言中有在很多语言中都有的而且其用法和语义也都是不尽相同的。尤其在C语言、C以及Java中都有volatile关键字。都可以用来声明变量或者对象。下面简单来介绍一下Java语言中的volatile关键字。 volatile的用法 volatile通常被比喻成轻量级的synchronized也是Java并发编程中比较重要的一个关键字。和synchronized不同volatile是一个变量修饰符只能用来修饰变量。无法修饰方法及代码块等。 volatile的用法比较简单只需要在声明一个可能被多线程同时访问的变量时使用volatile修饰就可以了。 public class Singleton {  private volatile static Singleton singleton;  private Singleton (){}  public static Singleton getSingleton() {  if (singleton  null) {  synchronized (Singleton.class) {  if (singleton  null) {  singleton  new Singleton();  }  }  }  return singleton;  }   }  如以上代码是一个比较典型的使用双重锁校验的形式实现单例的其中使用volatile关键字修饰可能被多个线程同时访问到的singleton。 volatile的原理 在再有人问你Java内存模型是什么就把这篇文章发给他中我们曾经介绍过为了提高处理器的执行速度在处理器和内存之间增加了多级缓存来提升。但是由于引入了多级缓存就存在缓存数据不一致问题。 但是对于volatile变量当对volatile变量进行写操作的时候JVM会向处理器发送一条lock前缀的指令将这个缓存中的变量回写到系统主存中。 但是就算写回到内存如果其他处理器缓存的值还是旧的再执行计算操作就会有问题所以在多处理器下为了保证各个处理器的缓存是一致的就会实现缓存一致性协议 缓存一致性协议每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是不是过期了当处理器发现自己缓存行对应的内存地址被修改就会将当前处理器的缓存行设置成无效状态当处理器要对这个数据进行修改操作的时候会强制重新从系统内存里把数据读到处理器缓存里。 所以如果一个变量被volatile所修饰的话在每次数据变化之后其值都会被强制刷入主存。而其他处理器的缓存由于遵守了缓存一致性协议也会把这个变量的值从主存加载到自己的缓存中。这就保证了一个volatile在并发编程中其值在多个缓存中是可见的。 volatile与可见性 可见性是指当多个线程访问同一个变量时一个线程修改了这个变量的值其他线程能够立即看得到修改的值。 我们在再有人问你Java内存模型是什么就把这篇文章发给他中分析过Java内存模型规定了所有的变量都存储在主内存中每条线程还有自己的工作内存线程的工作内存中保存了该线程中是用到的变量的主内存副本拷贝线程对变量的所有操作都必须在工作内存中进行而不能直接读写主内存。不同的线程之间也无法直接访问对方工作内存中的变量线程间变量的传递均需要自己的工作内存和主存之间进行数据同步进行。所以就可能出现线程1改了某个变量的值但是线程2不可见的情况。 前面的关于volatile的原理中介绍过了Java中的volatile关键字提供了一个功能那就是被其修饰的变量在被修改后可以立即同步到主内存被其修饰的变量在每次是用之前都从主内存刷新。因此可以使用volatile来保证多线程操作时变量的可见性。 volatile与有序性 有序性即程序执行的顺序按照代码的先后顺序执行。 我们在再有人问你Java内存模型是什么就把这篇文章发给他中分析过除了引入了时间片以外由于处理器优化和指令重排等CPU还可能对输入代码进行乱序执行比如load-add-save 有可能被优化成load-save-add 。这就是可能存在有序性问题。 而volatile除了可以保证数据的可见性之外还有一个强大的功能那就是他可以禁止指令重排优化等。 普通的变量仅仅会保证在该方法的执行过程中所依赖的赋值结果的地方都能获得正确的结果而不能保证变量的赋值操作的顺序与程序代码中的执行顺序一致。 volatile可以禁止指令重排这就保证了代码的程序会严格按照代码的先后顺序执行。这就保证了有序性。被volatile修饰的变量的操作会严格按照代码顺序执行load-add-save 的执行顺序就是load、add、save。 volatile与原子性 原子性是指一个操作是不可中断的要全部执行完成要不就都不执行。 我们在Java的并发编程中的多线程问题到底是怎么回事儿中分析过线程是CPU调度的基本单位。CPU有时间片的概念会根据不同的调度算法进行线程调度。当一个线程获得时间片之后开始执行在时间片耗尽之后就会失去CPU使用权。所以在多线程场景下由于时间片在线程间轮换就会发生原子性问题。 在上一篇文章中我们介绍synchronized的时候提到过为了保证原子性需要通过字节码指令monitorenter和monitorexit但是volatile和这两个指令之间是没有任何关系的。 所以volatile是不能保证原子性的。 在以下两个场景中可以使用volatile来代替synchronized 1、运算结果并不依赖变量的当前值或者能够确保只有单一的线程会修改变量的值。 2、变量不需要与其他状态变量共同参与不变约束。 除以上场景外都需要使用其他方式来保证原子性如synchronized或者concurrent包。 我们来看一下volatile和原子性的例子 public class Test {public volatile int i  0;public void increase() {i;}public static void main(String[] args) {final Test test  new Test();for(int i0;i10;i){new Thread(){public void run() {for(int j0;j1000;j)test.increase();};}.start();}while(Thread.activeCount()1)  //保证前面的线程都执行完Thread.yield();System.out.println(test.i);} }以上代码比较简单就是创建10个线程然后分别执行1000次i操作。正常情况下程序的输出结果应该是10000但是多次执行的结果都小于10000。这其实就是volatile无法满足原子性的原因。 为什么会出现这种情况呢那就是因为虽然volatile可以保证i在多个线程之间的可见性。但是无法保证i的原子性。 i操作一共有三个步骤load i add i ,save i。在多线程场景中如果这三个步骤无法按照顺序执行的话那么就会出现问题。 如上图两个线程同时执行i操作如果允许指令重排我们期望的结果是3但是实际执行结果可能是2甚至可能是1。 总结与思考 我们介绍过了volatile关键字和synchronized关键字。现在我们知道synchronized可以保证原子性、有序性和可见性。而volatile却只能保证有序性和可见性。 那么我们再来看一下双重校验锁实现的单例已经使用了synchronized为什么还需要volatile public class Singleton {  private volatile static Singleton singleton;  private Singleton (){}  public static Singleton getSingleton() {  if (singleton  null) {  synchronized (Singleton.class) {  if (singleton  null) {  singleton  new Singleton();  }  }  }  return singleton;  }   }  答案我们在下一篇文章既生synchronized何生volatile中介绍敬请期待。
http://www.sadfv.cn/news/152098/

相关文章:

  • 网站在哪备案手机端建站
  • 经典手机网站qq官网登录入口电脑版
  • 做公司网站需要哪些资料网站标题第一个词
  • 厦门php商城网站建设免费申请网站
  • 手表怎么在网站做推广三、网站开发使用软件环境
  • 江苏省建设厅官方网站公式公告衡水企业做网站
  • 商业网站建设规划书做哪一类网站容易有排名
  • 免费网站空间虚拟主机大学网站开发
  • 备案不关闭网站wordpress不好用
  • 网站关键字统计网站自助建设平台百度
  • 太原网站建设乛薇我如何做网络推广网站如何做推广
  • 怎么做网站后台管理系统网站运营存在的问题
  • 网站建设底部wordpress怎么解密密码
  • 企业做网站这些问题必须要注意自响应式网站建设清单
  • 网站建设 简易合同福州哪家企业网站建设设计最高端
  • 短网址赚钱平台wordpress安装说明seo工具好用
  • 有什么网站做悬赏的 能挣钱网站标题 关键字
  • 做新闻门户网站需要什么网页制作教程软件
  • 网站手机验证码怎么做推销网站的方法
  • 网站开发嫌工时长新手怎么引流推广推广引流
  • 推广网站建设花费得多少钱购买网站空间域名
  • 许昌做网站公司汉狮价格网络推广哪家好
  • 济南建站免费模板教育培训类网站建设与维护
  • 做标志的网站建一个商业网站要多少钱
  • 犀牛云做网站费用wordpress自定义栏目 插件
  • 天水网站开发技术招聘做导航网站赚钱吗
  • 怎么自己做刷赞网站a96中华室内设计网
  • 服务器上发布网站网站月流量
  • 淘宝客建站还能赚钱吗太原百度快速排名
  • 廉江手机网站建设公司企业推广网络营销外包服务