• Java内存模型(Java Memory Model,JMM):
    • 主内存与工作内存:Java内存模型主要是定义程序中各个变量的访问规则。Java内存模型规定了所有的变量都存储在主内存(Main Memory)中,每条线程
      还有自己的工作内存(Working Memory),线程的工作内存保存了被该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进
      行,而不能直接读写主内存中的变量。不同线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递均需要通过主内存来完成,线程、主内存、
      工作内存关系如下:
    • 内存间交互操作:
      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)

第十二章 Java内存模型与线程的更多相关文章

  1. 第十二章 Java内存模型与线程(待续)

    ············

  2. 深入理解java虚拟机-第12章Java内存模型与线程

    第12章 Java内存模型与线程 Java内存模型  主内存与工作内存: java内存模型规定了所有的变量都在主内存中,每条线程还有自己的工作内存. 工作内存中保存了该线程使用的主内存副本拷贝,线程对 ...

  3. 《Java并发编程实战》第十六章 Java内存模型 读书笔记

    Java内存模型是保障多线程安全的根基,这里不过认识型的理解总结并未深入研究. 一.什么是内存模型,为什么须要它 Java内存模型(Java Memory Model)并发相关的安全公布,同步策略的规 ...

  4. java并发编程实战:第十六章----Java内存模型

    一.什么是内存模型,为什么要使用它 如果缺少同步,那么将会有许多因素使得线程无法立即甚至永远看到一个线程的操作结果 编译器把变量保存在本地寄存器而不是内存中 编译器中生成的指令顺序,可以与源代码中的顺 ...

  5. 《深入理解Java虚拟机》-----第12章 Java内存模型与线程

    概述 多任务处理在现代计算机操作系统中几乎已是一项必备的功能了.在许多情况下,让计算机同时去做几件事情,不仅是因为计算机的运算能力强大了,还有一个很重要的原因是计算机的运算速度与它的存储和通信子系统速 ...

  6. 第12章 Java内存模型与线程

    参考<深入理解Java虚拟机> 一.Java内存模型 1.Java内存模型 2.内存间交互操作  流程图: 3.volatile关键字 两个特性: 3.1.保证变脸对所有线程的可见性: 由 ...

  7. 第十六章 Java内存模型(待续)

    ········

  8. Java并发程序设计(三) Java内存模型和线程安全

    Java内存模型和线程安全 一 .原子性 原子性是指一个操作是不可中断的.即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其它线程干扰. 思考:i++是原子操作吗?  二.有序性 Java代 ...

  9. JVM(7) Java内存模型与线程

    衡量一个服务性能的高低好坏,每秒事务处理数(Transactions Per Second,TPS)是最重要的指标之一,它代表着一秒内服务端平均能响应的请求总数,而 TPS 值与程序的并发能力又有非常 ...

随机推荐

  1. getRealPath()和getContextPath()的区别

    转载自:http://sucre.iteye.com/blog/319178 在程序中常常要获取文件的路径,有的时候需要用到相对路径而有的时候就要用到绝对路径,一提到绝对路径大家一定想到了getRea ...

  2. GitHub 优秀的项目地址

    Type LibDescription   LibLocation Android SlidingMenu   https://github.com/jfeinstein10/SlidingMenu ...

  3. 记一次网络原因导致的mysql连接中断问题(druid)

    date: 2018-04-19 21:00 tag: java,mysql,exception,mat,调试,jvm 工具: gceasy.io, MAT 线上系统出现一个诡异的bug,通过heap ...

  4. JavaScript中函数引用调用和函数直接调用的区别

    首先看下面的代码: var x = 1 var f1 = function( f ) { var x = 2 ; f( ' console.log( x ) ' ) } var f2 =  funct ...

  5. kickstart文件制作与光盘镜像制作

    kickstart文件,是linux(Redhat.Centos.Fedora)下的anaconda安装程序的配置文件,基于此文件,可以实现linux的无人值守安装,在需要大规模部署安装linux的情 ...

  6. Mac上,Apache启动正常,却无法访问localhost和127.0.0.1

    mac系统,之前一直好好的,今天突然localhost以及127就突然打不开了.显示拒绝访问. 各种方法都试过了,不是端口占用, 不是日志文件缺失,任何情况都不是. 想了想,之前有升级过PHP从5升级 ...

  7. 终于不再在懵逼mysql原生语句,orm超级登场

    import sqlalchemy from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import cre ...

  8. kali在执行 apt-get update 命令时报错的解决方法

    报错内容: root@kali:~# apt-get updateGet:1 http://kali.mirror.garr.it/mirrors/kali kali-rolling InReleas ...

  9. JDBC-Oracle连接教程

    前言 本文通过一个在Eclipse平台中搭建的小项目,在项目中使用一条静态命令来查询Oracle数据库测试用户“scott”下emp表中的几个字段,来学习JDBC连接数据库的方法.看完之后读者可以基本 ...

  10. Assembly Experiment4

    AIMS & PREPARATIONS of THIS EXPERIMENT: SCREENSHOTS of THIS EXPERIMENT: 1. change 0403h to 0441h ...