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.与单一职责原则冲突;

      

  • 相关阅读:
    nginx能访问html静态文件但无法访问php文件
    LeetCode "498. Diagonal Traverse"
    LeetCode "Teemo Attacking"
    LeetCode "501. Find Mode in Binary Search Tree"
    LeetCode "483. Smallest Good Base" !!
    LeetCode "467. Unique Substrings in Wraparound String" !!
    LeetCode "437. Path Sum III"
    LeetCode "454. 4Sum II"
    LeetCode "445. Add Two Numbers II"
    LeetCode "486. Predict the Winner" !!
  • 原文地址:https://www.cnblogs.com/wnwn/p/12580795.html
Copyright © 2011-2022 走看看