当前位置: 首页 > news >正文

第十二章 Java内存模型与线程

  • Java内存模型(Java Memory Model,JMM):
    • 主内存与工作内存:Java内存模型主要是定义程序中各个变量的访问规则。Java内存模型规定了所有的变量都存储在主内存(Main Memory)中,每条线程
      还有自己的工作内存(Working Memory),线程的工作内存保存了被该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进
      行,而不能直接读写主内存中的变量。不同线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递均需要通过主内存来完成,线程、主内存、
      工作内存关系如下:
      Java内存
    • 内存间交互操作:
      8种操作:
               1.lock(锁定):作用于主内存的变量,它把一个变量标识标识为一条线程独占的状态。
               2.unlock(解锁):作用于主内存的变量,它把一个处于锁定状态的变量释放出来,释放后的变量才可以被其它线程锁定。
               3.read(读取):作用于主内存的变量,它把一个变量的值从主内存传输到线程的工作内存中,以便随后的load动作使用。
               4.load(载入):作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中。
               5.use(使用):作用于工作内存的变量,它把工作内存中的一个变量的值传递给执行引擎,每当虚拟机遇到一个需要使用
                                              到变量的值的字节码指令时将会执行这个操作。
               6.assign(赋值):作用于工作内存的变量,它把一个从执行引擎接收到的值赋给工作内存的变量,每当虚拟机遇到一个给
                                                  变量赋值的字节码指令时执行这个操作。
               7.store(存储):作用于工作内存的变量,它把工作内存中的一个变量的值传送到主内存中,以便随后的write操作使用。
               8.write(写入):作用于主内存的变量,它把store操作从工作内存中得到的变量值放入主内存的变量中。
      操作规则:
              1.不允许read和load、store和write操作之一单独出现。
              2.不允许线程丢弃它最近的assign操作。
              3.不允许线程无原因地把线程的工作内存同步回主内存中。
              4.新变量只能在主内存中产生。
              5.只能有一个线程在同一时刻执行lock操作。
              6.lock时会清空工作内存中该变量副本的值。
              7.unlock必须成对出现。
              8.unlock会同步回主内存。
    • valatile:Java虚拟机最轻量级的同步机制,1.保证此变量对所有线程的可见性。2.禁止指令重排序优化。
    • 原子性、可见性、有序性。
    • 先行发生原则:1.程序次序规则(Program Order Rule) 2.管程锁定规则(Monitor Lock Rule) 3.volatile变量规则(volatile variable rule)
                                   4.线程启动规则(thread start rule) 5.线程终止规则(thread termination rule) 6.线程中断规则(thread interruption rule)
                                   7.对象终结规则(finalizer rule) 8.传递性(transitivity)
  • Java与线程:
    • 线程的实现:1.使用内核线程实现 2.使用用户线程实现 3.使用用户线程加轻量级进程混合实现
    • Java线程调度:线程调度是指系统为线程分配处理器使用权的过程,有两种:1.协同式(Cooperative) 2.抢占式(Preemptive)
    • 状态转换:java定义了5种线程状态:1.新建(New)2.运行(Runable) 3.等待(Waiting) 4.阻塞(Blocked) 5.结束(Terminated)

转载于:https://www.cnblogs.com/jdktomcat/p/10245692.html

相关文章:

  • 从源码分析如何优雅的使用 Kafka 生产者
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • 阿里云重庆大学大数据训练营落地分享
  • Android Studio多渠道打包实战
  • 传统企业触网的战略--借助电商外包
  • 本周ASP.NET英文技术文章推荐[06/10 - 06/16]
  • 匈奴的历史简述
  • SpringCloud(Finchley版)6 - Config-Client
  • Golang-长连接-状态推送
  • 硬盘结构
  • 虚函数可不可以是内联函数
  • 用JS实现人脑和计算机交互,这个厉害了
  • 翻硬币
  • How cc Works 中文译文
  • 如何优雅地查看 JS 错误堆栈?
  • 《剑指offer》分解让复杂问题更简单
  • Asm.js的简单介绍
  • avalon2.2的VM生成过程
  • centos安装java运行环境jdk+tomcat
  • EOS是什么
  • JavaWeb(学习笔记二)
  • JDK 6和JDK 7中的substring()方法
  • NSTimer学习笔记
  • Phpstorm怎样批量删除空行?
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • React-生命周期杂记
  • Redis在Web项目中的应用与实践
  • VUE es6技巧写法(持续更新中~~~)
  • vue数据传递--我有特殊的实现技巧
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 简单基于spring的redis配置(单机和集群模式)
  • 设计模式 开闭原则
  • 使用 QuickBI 搭建酷炫可视化分析
  • 小程序01:wepy框架整合iview webapp UI
  • 学习JavaScript数据结构与算法 — 树
  • 一个完整Java Web项目背后的密码
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • ​一些不规范的GTID使用场景
  • # 计算机视觉入门
  • #pragma pack(1)
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (10)STL算法之搜索(二) 二分查找
  • (14)Hive调优——合并小文件
  • (175)FPGA门控时钟技术
  • (2)MFC+openGL单文档框架glFrame
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (翻译)terry crowley: 写给程序员
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (十八)三元表达式和列表解析
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • ***原理与防范
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1