zoukankan      html  css  js  c++  java
  • java内存模型

    +这里来复习一下java多线程的三大特性 : 原子性,可见性,有序性。

    • 什么是原子性

    • 即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。
      一个很经典的例子就是银行账户转账问题:
      比如从账户A向账户B转1000元,那么必然包括2个操作:从账户A减去1000元,往账户B加上1000元。这2个操作必须要具备原子性才能保证不出现一些意外的问题。
      我们操作数据也是如此,比如i = i+1;其中就包括,读取i的值,计算i,写入i。这行代码在Java中是不具备原子性的,则多线程运行肯定会出问题,所以也需要我们使用同步和lock这些东西来确保这个特性了。
      原子性其实就是保证数据一致、线程安全一部分,
      这个也可以理解为数据库的事务

    • 什么是可见性

    • 当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。

    • 若两个线程在不同的cpu,那么线程1改变了i的值还没刷新到主存,线程2又使用了i,那么这个i值肯定还是之前的,线程1对变量的修改线程没看到这就是可见性问题。

    • 什么是有序性

    • 程序执行的顺序按照代码的先后顺序执行。

    • 一般来说处理器为了提高程序运行效率,可能会对输入代码进行优化,它不保证程序中各个语句的执行先后顺序同代码中的顺序一致,但是它会保证程序最终执行结果和代码顺序执行的结果是一致的。如下:
      int a = 10; //语句1
      int r = 2; //语句2
      a = a + 3; //语句3
      r = a*a; //语句4
      则因为重排序,他还可能执行顺序为 2-1-3-4,1-3-2-4
      但绝不可能 2-1-4-3,因为这打破了依赖关系。
      显然重排序对单线程运行是不会有任何问题,而多线程就不一定了,所以我们在多线程编程时就得考虑这个问题了。

    • 注意不要将JMM和JVM的内存机制混淆在一起。

    java可见性原理分析

    • java多线程内存读写机制
    • java多线程内存读写机制

    假如线程在同一时刻拿到副本,并且对这个副本就行自增操作,那么返回回来的变量并没有+2,而是+1,这就暴露了线程不同步问题。

  • 相关阅读:
    CLR线程池基础
    何时使用线程
    【转】PowerShell入门(十一):编写脚本模块
    【转】PowerShell入门(十):使用配置文件
    【转】PowerShell入门(九):访问.Net程序集、COM和WMI
    【转】PowerShell入门(八):函数、脚本、作用域
    【转】PowerShell入门(七):管道——在命令行上编程
    【转】PowerShell入门(六):远程操作
    【转】PowerShell入门(五):Cmd命令与PowerShell命令的交互
    【转】PowerShell入门(四):如何高效地使用交互式运行环境?
  • 原文地址:https://www.cnblogs.com/adroitwolf/p/14309824.html
Copyright © 2011-2022 走看看