Java内存模型与线程_学习笔记
深入理解java虚拟机:
1、java内存模型
java虚拟机规范中试图定义一种Java内存模型。Java Memory Model(JMM)
1.1 主内存与工作内存
java内存模型规定所有的变量都存储在主内存中(Main Memory)中。
每个线程还有自己的工作内存(working Memory),线程的工作内存保存了该线程使用到的变量的主内存副本拷贝,线程对变量的操作都在工作内存中,而不能直接读写主内存中的变量。

1.2 内存见交互操作


1.3 volatile变量的特殊规则
保证对所有线程有可见性
禁止指令重排优化
1.4对于long和double型变量的特殊规则
JMM要求1.2中的8个操作具有原子性,但是对于64位数据类型(long double)
允许虚拟机将没有被volatile修饰的64位数据的读写操作划分为两次32位的操作来进行。
即不保证64位数据类型 load store read write这4个操作的原子性。
所有当有多个线程共享未声明位volatile的long或double类型的变量,某些线程就会读到“半个变量”的数值。
1.5 原子性 可见性 有序性
原子性:read,load,assign,use,write,synchronized之间的操作
可见性:当一个线程修改了某个变量,其他线程能够立刻得知这个修改。
volatile,synchronized,final均有可见性
同步块的的可见性在于,一个变量执行unlock之前,必须先把此变量同步回主内存中。
有序性:如果在本线程中观察,所有的操作都是有序的。如果在一个线程中观察另一个线程,所有操作都是无序的。
前半句是指:线程内表现为串行语义
后半句是指:指令重排,工作内存与主内存同步延迟
1.6 先行发生原则
时间先后顺序与先行发生原则之间基本没有太大关系,所以当我们衡量并发安全问题的时候不要收到时间顺序的干扰,一切必须按照先行发生原则为准。

2 Java与线程
2.1 线程的实现
线程式比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开,各个线程既可以共享进程资源(内存地址,文件I?O),又可以独立调度。(线程式CPU调度的基本单位)
实现线程有三种方法:
1、使用内核线程实现
内核线程 Kernel-level Thread,KLT 直接由操作系统内(Kernel)支持的线程。内核通过操纵调度器(Scheduler)对线程进行调度,并将线程的任务映射到各个处理器上。
支持多线程的内核叫多线程内核 multi-Threads kernel
程序不会直接使用内核线程,而且使用内核线程的一种高级接口---轻量级进程 Light Weight Process LWP

由于内核线程的支持,每个轻量级进程都成为一个独立的调度单位,及时有一个轻量进程在系统中阻塞,也不会影响到整个进程的工作。
局限性:基于内核线程实现,各种线程操作,例如创建,析构及同步,都需要进行系统调用。
系统调用的代价享队较高,需要在用户态(User Mode)和内核态(Kernel Mode)中来回切换。其次,轻量进程需要下号一定的内核资源,因此一个系统支持轻量级进程的数量是有限的。
2、使用用户线程实现
广义上来讲,一个线程只要不是内核线程,就可以认为是用户线程(User Thread),从这个定义来讲,轻量级进程也属于用户进程。
狭义上用户线程指的是完全建立在用户空间的线程库上,系统内核不能感知线程存在的实现。
如果程序实现得当,这种线程不需要切换到内核态,因此操作可以是非常快速且低消耗的,也可以支持规模更大的线程数量,部分高性能数据库中的多线程就是有用户线程实现的。

由于操作系统只能把处理器资源分配到进程,诸如“阻塞如何处理”,“多处理器系统中如何将线程映射到到其他处理器”,这类问题解决起来异常困难,甚至不可完成。
因而使用用户线程实现的程序一般都比较复杂。
3.使用用户线程加轻量级进程混合实现
操作系统提供支持的轻量级进程作为用户线程和内核线程之间的桥梁,这样内核提供的线程调度功能及处理器映射,并且用户线程的系统调用要通过轻量级线程来完成,降低整个进程被完全阻塞的风险。
用户线程与轻量级进程的数目比也不一定 N:M

2.2、Java线程的实现
2.3、java线程调度
线程调度是指系统为线程分配处理器使用权的过程
协同式线程调度
抢占式线程调度
Java线程调度式系统自动完成的,但是建议给线程设置优先级。
状态转换:

Waiting:处于这个状态的线程不会被分配CPU执行时间,他们要等待被其他线程显示地唤醒。

Timed Waiting:处于这个状态的线程不会被分配CPU执行时间,无须等待其他线程显示唤醒。在一定时间之后会由系统自动唤醒。

Blocked(阻塞):程序等待进入同步区域的时候,线程处于这种状态。
Java内存模型与线程_学习笔记的更多相关文章
- 《深入了解java虚拟机》高效并发读书笔记——Java内存模型,线程,线程安全 与锁优化
<深入了解java虚拟机>高效并发读书笔记--Java内存模型,线程,线程安全 与锁优化 本文主要参考<深入了解java虚拟机>高效并发章节 关于锁升级,偏向锁,轻量级锁参考& ...
- jvm(12)-java内存模型与线程
[0]README 0.1)本文部分文字描述转自“深入理解jvm”,旨在学习“java内存模型与线程” 的基础知识: [1]概述 1)并发处理的广泛应用是使得 Amdahl 定律代替摩尔定律称为计 ...
- 一夜搞懂 | Java 内存模型与线程
前言 本文已经收录到我的 Github 个人博客,欢迎大佬们光临寒舍: 我的 GIthub 博客 学习导图 一.为什么要学习内存模型与线程? 并发处理的广泛应用是 Amdah1 定律代替摩尔定律成为计 ...
- java内存模型与线程(转) good
java内存模型与线程 参考 http://baike.baidu.com/view/8657411.htm http://developer.51cto.com/art/201309/410971_ ...
- Java并发程序设计(三) Java内存模型和线程安全
Java内存模型和线程安全 一 .原子性 原子性是指一个操作是不可中断的.即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其它线程干扰. 思考:i++是原子操作吗? 二.有序性 Java代 ...
- 深入理解java虚拟机-第12章Java内存模型与线程
第12章 Java内存模型与线程 Java内存模型 主内存与工作内存: java内存模型规定了所有的变量都在主内存中,每条线程还有自己的工作内存. 工作内存中保存了该线程使用的主内存副本拷贝,线程对 ...
- (Java多线程系列七)Java内存模型和线程的三大特性
Java内存模型和线程的三大特性 多线程有三大特性:原子性.可见性.有序性 1.Java内存模型 Java内存模型(Java Memory Model ,JMM),决定一个线程对共享变量的写入时,能对 ...
- 深入理解Java虚拟机(第三版)-13.Java内存模型与线程
13.Java内存模型与线程 1.Java内存模型 Java 内存模型的主要目的是定义程序中各种变量的访问规则,即关注在虚拟机中把变量值存储到主内存和从内存中取出变量值的底层细节 该变量指的是 实例字 ...
- Java内存模型与线程(一)
Java内存模型与线程 TPS:衡量一个服务性能的标准,每秒事务处理的总数,表示一秒内服务端平均能够响应的总数,TPS又和并发能力密切相关. 在聊JMM(Java内存模型)之前,先说一下Java为什么 ...
随机推荐
- java循环删除List元素的方法总结
1.for循环 2.迭代器 3.过渡法 import java.util.*; /** * Created by HP on 2018/8/2. */ public class Test { publ ...
- 【ACM之行】◇第一站◇ 2018HDU多校赛总结
◇第一站◇ 2018HDU多校赛 十场多校赛下来,也算是给一个初中生开了眼界……看着清华一次次AK(默默立下flag),看着自己被同校的高中生完虐,一个蒟蒻只能给dalao们垫脚
- Maven - 修改本地仓库位置
默认的本地仓库是在:当前的用户目录/.m2/repository 修改位置: 1. 打开maven的conf/settings.xml,找到如下图这一段: 2. 把<localRepositor ...
- linux基础目录
第1章 linux目录结构 1.1 linux目录结构的特点 一切皆文件 1)倒挂的树状结构 一切从根开始 2)linux每个目录可以挂载在不同的设备(磁盘)上.windows不容易做到. /da ...
- 【js】【读书笔记】廖雪峰的js教程读书笔记
最近在看廖雪峰的js教程,重温了下js基础,记下一些笔记,好记性不如烂笔头嘛 编写代码尽量使用严格模式 use strict JavaScript引擎是一个事件驱动的执行引擎,代码总是以单线程执行 执 ...
- 使用MD5比较两个文件是否相同
MD5算法:是计算机广泛使用的一种哈希算法,将数据(如汉字)运算为另一固定长度值,用于确保信息传输完整一致.java,C++ 等多种编程语言都有MD5的实现,可直接使用. 文件MD5值:每个文件都可以 ...
- Android 工具类 异常处理类CrashHandler
1.整体分析 1.1.源代码如下,可以直接Copy. public class CrashHandler implements Thread.UncaughtExceptionHandler { pr ...
- RandomAecessFile open failed: EISDIR (Is a directory)
今天下午搞断点续传,下载文件的时候,弄了一下,我把下载的文件命名为plug.jar.后来老是报错: open failed: EISDIR (Is a directory) 我烦了,两个小时啊,我操. ...
- Trident整合Kafka
首先编写一个打印函数KafkaPrintFunction import org.apache.storm.trident.operation.BaseFunction; import org.apac ...
- (A)eclipse搭建springboot项目入门
网上许多资料都是用idea的,但是我个人用eclipse习惯了,所以就在eclipse里面自己尝试着写了一个hello. 然而项目建好后却迟迟不能访问!!!网上搜了许多资料都不靠谱! 虽然最后能看到h ...