zoukankan      html  css  js  c++  java
  • 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。
  • 相关阅读:
    第一个mpvue小程序开发总结
    ES6学习笔记(一)——扩展运算符和解构赋值
    我所理解的发布订阅模式
    移动web开发适配方案之Rem
    探究JS中对象的深拷贝和浅拷贝
    《BAT前端进阶[师徒班]》学习总结
    浅析使用vue-router实现前端路由的两种方式
    webpack之proxyTable设置跨域
    《免费前端教程不会告诉你这些》知乎LIVE读后感
    MySQL binlog-server搭建
  • 原文地址:https://www.cnblogs.com/grefr/p/5046356.html
Copyright © 2011-2022 走看看