java多线程基础篇第一篇
1.在开始多线程之前,我们先来聊聊计算机的缓存
计算机处理一个程序需要cpu处理器与存储设备的交互。但是在计算机发展的过程中,cpu处理器的处理速度不断提高,而存储设备的读写速度却没有得到与cpu同样速度的发展。为了解决这个问题,我们在处理器与存储设备之间加了一层缓存,基本上解决了cpu与存储设备速度的差别。现在的计算机缓存大体上分为三级,L1级缓存,L2级缓存,L3级缓存,其中L1,L2级缓存属于每个cpu独享,L3级缓存属于多个cpu共享。但是这也引发了一个问题,就是对于共享数据操作的一致性问题。为了解决这个问题,在cpu与缓存之间,我们制定了缓存一致性协议,最常见的就是MESI协议。其中计算机cpu的缓存如下图所示。
解读:计算机处理器与主内存之间添加了一层缓存,为了保证各个处理器对于主内存中数据操作的安全性,引入了缓存一致性协议。各个处理器与主内存中数据的交互必须是建立在缓存一致性协议之上的。
2.理解JMM(java内存模型)
Java虚拟机试图定义一种java内存模型,从而屏蔽掉不同硬件和操作系统的内存访问差异,以实现让java程序在各种平台下都能够达到一致性访问的效果。为此,java定义了下面的java内存模型,如下图。
解读:从图中我们可以大概了解到java内存模型。首先是在每个单独的线程中有一个工作内存,各个工作内存互不干扰。每个线程操作主内存中的数据时,首先是从主内存中拷贝一份到工作内存(read和load操作,后面具体说明),然后对工作内存中的副本进行操作(use和assgin操作,后面具体说明),最后在将工作内存中的数据刷新到主内存中(store和write操作,后面具体说明)。以上就是java内存模型的大概操作流程,下面将详细介绍。
主内存与工作内存的交互:关于主内存和工作内存的交互,在java内存模型定义了8种原子操作,分别是lock,read,load,use,assign,store,write,unlock,下面逐一介绍下。
lock:表示锁定操作,作用于主内存中的变量,表示将一个变量标识线程独占状态,即一个线程标识为lock的变量,其它线程无法访问。
unlock:表示解锁操作,作用于主内存中的变量,表示将一个锁定的变量释放,只有被释放的变量才可被其它的线程访问。
read:表示读取操作,作用于主内存中的变量,表示将一个变量从主内存传输到工作内存。
load:表示载入操作,作用于工作内存中的变量,表示将read操作获取到的变量值存储到工作内存的变量副本之中。
use:表示使用操作,作用于工作内存中的变量,表示将工作内存中一个变量的值传递给执行引擎,每当虚拟机遇到一个需要使用变量值的字节码指令时将会执行这个操作。
assgin:表示赋值操作,作用于工作内存中的变量,表示将一个从执行引擎获取到的值传递给工作内存中的变量,每当虚拟机遇到一个给变量赋值的字节码指令时将会执行这个操作。
store:表示存储操作,作用于工作内存中的变量,表示将一个工作内存中的变量值传递到主内存中,以方便随后的write操作。
write:表示写入操作,作用于主内存中的变量,表示将store操作从工作内存中传递的变量值存储到主内存中的变量中。
除了上述这八种操作之外,java内存模型定义了这八种操作的一些规则。
规则一:不允许一个变量从主内存中读取了,但工作内存不接收。也不允许一个变量从工作内存发起了回写,但主内存不接收。即read与load,store与write不许单独出现。
规则二:一个变量在工作内存中修改之后,必须同步回主内存。即assign操作之后,必须执行store和write操作。
规则三:一个变量在线程中没有执行assgin之前,不允许同步回主内存。
规则四:在一个线程中对变量执行use和store之前,必须先执行了assign和load操作。
规则五:lock和unlock操作规则,一个变量同一时刻只允许同一个线程对其执行lock操作,并且同一个线程可以对其执行多次lock操作。执行了多少次lock操作,释放这个变量的时候也必须执行多少次的unlock操作。
规则六:lock和unlock操作规则,对于执行了lock操作的一个变量,将会清空工作内存中这个变量的值,在执行引擎需要使用到这个变量的值时,需要先执行load或assign初始化这个变量的值。
规则七:lock和unlock操作规则,一个没有被执行lock操作的变量,不予许被执行unlock操作。一个线程对变量执行的lock操作,只能由当前这个线程对其执行unlock操作。
规则八:lock和unlock操作规则,一个变量被执行unlock之前,必须先将此变量同步回主内存,即执行store和write操作。
java多线程之volatile关键字
java多线程基础篇第一篇的更多相关文章
- 【Todo】【读书笔记】Java多线程编程指南-设计模式篇
下了这本书<Java多线程编程指南-设计模式篇>, 还有另一本<JAVA多线程设计模式>,据说内容有重复,结合着看.
- 【MM系列】SAP MM模块-基础配置第一篇
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP MM模块-基础配置第一篇 ...
- [转]Java多线程干货系列—(一)Java多线程基础
Java多线程干货系列—(一)Java多线程基础 字数7618 阅读1875 评论21 喜欢86 前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们 ...
- Java 多线程——基础知识
java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...
- Java多线程--基础概念
Java多线程--基础概念 必须知道的几个概念 同步和异步 同步方法一旦开始,调用者必须等到方法调用返回后,才能执行后续行为:而异步方法调用,一旦开始,方法调用就立即返回,调用者不用等待就可以继续执行 ...
- Java多线程基础知识总结
2016-07-18 15:40:51 Java 多线程基础 1. 线程和进程 1.1 进程的概念 进程是表示资源分配的基本单位,又是调度运行的基本单位.例如,用户运行自己的程序,系统就创建一个进程, ...
- Java 多线程基础(五)线程同步
Java 多线程基础(五)线程同步 当我们使用多个线程访问同一资源的时候,且多个线程中对资源有写的操作,就容易出现线程安全问题. 要解决上述多线程并发访问一个资源的安全性问题,Java中提供了同步机制 ...
- JVM学习篇-第一篇
JVM学习篇-第一篇 JDK( Java Development Kit): Java程序设计语言.Java虚拟机.Java类库三部分统称为JDK,JDK是用于支持Java程序开发的最小环境** ...
- Java多线程基础:进程和线程之由来
转载: Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够 ...
- Java基础16:Java多线程基础最全总结
Java基础16:Java多线程基础最全总结 Java中的线程 Java之父对线程的定义是: 线程是一个独立执行的调用序列,同一个进程的线程在同一时刻共享一些系统资源(比如文件句柄等)也能访问同一个进 ...
随机推荐
- Clion快捷键
快捷键配置 File->Setting->Keymap->Keymaps 选择Visual Studio风格 代码提示的匹配模式 File->Setting->Edito ...
- java中的超类是什么
超类(SuperClass) :用java术语来讲,被继承的类称为超类(SuperClass),也有叫做父类,继承的类称为子类.
- vue keepalive 动态设置缓存
场景:A首页.B列表页.C详情页B---->C 缓存‘列表1’详情的数据A---->C 读取‘列表1’详情的数据B---->C (希望清除‘列表1’的缓存,变成缓存‘列表2’详情的数 ...
- 【git】git hello world
以前不怎么会用. http://blog.sina.com.cn/s/blog_1485511700102xdig.html git add 文件夹/ 添加整个文件夹及内容 gi ...
- pytorch识别CIFAR10:训练ResNet-34(微调网络,准确率提升到85%)
版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com 在前一篇中的ResNet-34残差网络,经过训练准确率只达到80%. 这里对网络做点小修改,在最开始的 ...
- jsonp原理详解
1.一个众所周知的问题,Ajax直接请求普通文件存在跨域无权限访问的问题,甭管你是静态页面.动态网页.web服务.WCF,只要是跨域请求,一律不准. 2.不过我们又发现,Web页面上调用js文件时则不 ...
- Django(五)母版继承、Cookie、视图装饰器等
大纲 一.内容回顾 补充:默认值 补充:命名空间 二.模板语言 1.母版继承 2.include 3.自定义simple_tag 三.Cookie Cookie 使用总结 四.视图 1.获取用户请求相 ...
- C#给字符串赋予字面值——字符串插入、转义序列的使用
1.占位符.字符串插入 给字符串赋予字面值时,经常遇见在字符串中包含变量的情况,用连接符进行拼接.转换的方式比较麻烦.还容易出错.C#提供了较为便捷的处理方式,即‘占位符’,以及C#6的新功能‘插入字 ...
- Python基础:数据类型-字符串(7)
1.字符串基本操作 字符串是由字符组成的一串字符序列,字符串是有顺序的,从左到右,索引从0开始,依次递增. Python中字符串类型:str. Python中字符串的三种表示方式: (1)普通字符串: ...
- Java内存溢出和内存泄露后怎么解决
1.首先这里先说一下内存溢出和内存泄露的区别: 内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory:比如申请了一个integer,但 ...