一、Java 内存模型

java内存模型把 Java 虚拟机内部划分为线程栈和堆

下面这张图演示了调用栈和本地变量存放在线程栈上,对象存放在堆上。

     ==》》 

一个局部变量可能是原始类型,在这种情况下,它总是“呆在”线程上。

一个局部变量也可能是指向一个对象的一个引用。在这种情况下,引用(这个本地变量)存放在线程栈上,但是对象本身存放在堆上

一个对象可能包含方法,这些方法可能包含局部变量。这些本地变量任然存放在线程栈上,即使这些方法所属的对象存放在堆上。

一个对象的成员变量可能随着这个对象自身存放在上。不管这个成员变量是原始类型还是引用类型。

静态成员变量跟随着类定义一起也存放在上。

存放在堆上的对象可以被所有持有对这个对象引用的线程访问。当一个线程可以访问一个对象时,它也可以访问这个对象的成员变量。如果两个线程同时调用同一个对象上的同一个方法,它们将会都访问这个对象的成员变量(共享),但是每一个线程都拥有这个方法内局部变量的私有拷贝。

二、计算机硬件内存模型

三、java内存模型与硬件内存架构之间桥接

Java 内存模型与硬件内存架构之间存在差异。硬件内存架构没有区分线程栈和堆。对于硬件,所有的线程栈和堆都分布在主内中。部分线程栈和堆可能有时候会出现在 CPU 缓存中和 CPU 内部的寄存器中。

当对象和变量被存放在计算机中各种不同的内存区域中时,就可能会出现一些具体的问题。主要包括如下两个方面:

  • 线程对共享变量修改的可见性                                =》共享变量加上volatile 关键字
  • 当读,写和检查共享变量时出现 race conditions       =》同步解决,同步块还可以保证代码块中所有被访问的变量将会从主存中读入,当线程退出同步代码块时,所有被更新的变量都会被刷新回主存中去,不管这个变量是否被声明为 volatile。

最新文章

  1. .Net分布式异常报警系统-服务端Service
  2. i++和++i的区别
  3. 强制性签出被人没有签入的文件(在.net开发vs中)
  4. Cloudera 建议使用 NTP 使 Hadoop 群集实现时间同步
  5. ng-select ng-options ng-repeat的用法与区别
  6. 为iPhone 6设计自适应布局
  7. 【JavaScript】标签样式中多出了element.style
  8. 《算法导论》 — Chapter 7 高速排序
  9. centos下美团sql优化工具SQLAdvisor的安装
  10. 使用redis设计一个简单的分布式锁
  11. 创建对象-constructor丢失的问题
  12. redux (一)
  13. web测试点总结---UI、兼容、功能、交互、安全、性能、接口测试
  14. JDK 8 之 Stream sorted() 示例
  15. [Swift]LeetCode149. 直线上最多的点数 | Max Points on a Line
  16. tick 能见度
  17. 解决java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone
  18. MySQL5.6复制技术(2)-主从部署以及半同步配置详细过程
  19. winform菜单栏、工具栏
  20. 机器学习笔记(十)EM算法及实践(以混合高斯模型(GMM)为例来次完整的EM)

热门文章

  1. (转)淘淘商城系列——Solr的安装
  2. Jmeter之JDBC请求参数化(二)
  3. python利用requests统计1个接口的响应时间
  4. 梦想CAD控件安卓界面控制
  5. https报错注销源文件内容
  6. Python单例模式的实现方式
  7. Linux 复习四
  8. PAT 1143 Lowest Common Ancestor
  9. Linear and Logistic Regression in TensorFlow
  10. 算(tyvjP4700)