• java并发之原子性


    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp17

    1、原子性操作:
    不能被线程调度机制中断的操作;--对原子性变量的赋值和返回操作通常都是原子性的
    原子性可以用于除了long和double之外的所有基本类型上的简单操作(当做不可分的原子),但是JVM将64位的  (long 和double变量)读取和写入当成是两个分离的32位      操作来执行。

    2、同步机制与可视性:
    同步机制强制在处理器系统中,一个任务做出的修改必须在应用中是可视的,如果没有同步机   制,那么修改时可视性将无法确定。

    3、关于volatile:
         (1)当你定义long或者double的时候,如果使用volatile关键字,就会获得原子性(JDK 1.5之前不支持)
         (2)volatile关键字还确保了应用中的可视性。
         (3)当一个域的值依赖于他之前的值时(比如说自增)volatile就无法工作了。
         (4)如果一个域的值受到其他域的值得限制,那么volatile也就无法工作了--例如Range类的lower和upper边界就必须遵守lower<=upper。

    4、volatile、synchronized和主存:
         (1)如果你将一个域声明为volatile,只要对这么域近些了写操作,那么所有的读操作都可以看到这个修改,即便使用了本地缓存,情况也确实如此,volatile域会立即写入到主存中,而读操作就发生在主存中。
         (2)在非volatile域上的原子操作不必刷新到主存中去,因此其他读取该域的任务也不必看到该新值。
         (3)同步也会导致向主存中刷新,因此一个域如果完全由synchronized方法或者语句块来保护,那就不必将其设置为volatile。
         (4)一个任务进行的任何写入操作对于这个任务本生都是可视的。
         (5)使用volatile而不是synchronized唯一安全的情况就是类中只有一个可变的域。--实现同步第一选择应该是synchronized。
  • 相关阅读:
    为什么叫做重叠端口?
    为什么叫做重叠端口?
    拷贝构造函数的参数为什么必须使用引用类型
    拷贝构造函数的参数为什么必须使用引用类型
    2018 网易校招题目
    似友非友?
    贫穷与富有
    (OK) Android
    Android
    (OK) Android
  • 原文地址:https://www.cnblogs.com/grefr/p/5046356.html
Copyright © 2020-2023  润新知