zoukankan      html  css  js  c++  java
  • volatile

    volatile的应用

      在多线程并发程序中synchronized和volatile都扮演者着很重要的角色,volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的可见性,能够防止脏读,被volatile关键字修饰的变量,如果值发生了改变,其他线程立刻可见;

      可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值,如果volatile变量修饰符使用恰当的话,它比synchronized的使用和执行成本更低;

    volatile定义

      java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量;java语言提供了volatile,在某些情况下比锁更加方便,如果一个字段被声明成volatile,java线程内存模型确保所有线程看到这个变量的值是一致的;

    volatile和synchronized有什么区别

      volatile能够保证数据可见性,但是无法保证数据的原子性;

      synchronized能够保证数据可见性,也能保证数据原子性;

    volatile使用条件

      只能在有限的一些情形下使用volatile变量替代锁;要使volatile变量提供理想的线程安全,必须满足下面两个条件:

        1.对变量的写操作不依赖于当前值;

        2.该变量没有包含在具体变量的不变式中;

      实际上,这些条件声明,可以被写入volatile变量的这些有效值独立于任何程序的状态,包含变量的当前状态;

      第一个条件的限制使volatile变量不能用作线程安全计数器;虽然增量操作(i++)看上去类似于一个单独的操作,实际上它是一个由(读取-修改-写入)操作序列组成的组合操作;必须以原子方式执行,而volatile不能提供必须的原子特性;实现正确的操作需要使i的值在操作期间保持不变,而volatile变量无法实现这点;

    volatile优点

      1.内存中只有一个对象,减少内存开销;

      2.单例可避免对资源的多重占用,例如写文件工作,可避免对同一资源文件的同时写操作;

    volatile缺点

      1.单例模式一般没有接口,扩展很困难;

      2.不利于测试,并行开发时,若单例未完成,则不能进行测试;

      3.与单一职责原则冲突;

      

  • 相关阅读:
    asp.net 验证正则表达式
    c语言编程题
    使用Code First创建数据模型
    c语言知识点
    rabbitmq 简单应用
    influxdb(二)
    influxdb(一)
    K8S 日志收集(六):kibana 安装
    K8S 日志收集(五):head插件安装
    K8S 日志收集(四):logstash 安装
  • 原文地址:https://www.cnblogs.com/wnwn/p/12580795.html
Copyright © 2011-2022 走看看