Java内存模型与线程_学习笔记

深刻理解java虚拟机:java

一、java内存模型数据库

java虚拟机规范中试图定义一种Java内存模型。Java Memory Model(JMM)安全

1.1 主内存与工做内存多线程

java内存模型规定全部的变量都存储在主内存中(Main Memory)中。并发

每一个线程还有本身的工做内存(working Memory),线程的工做内存保存了该线程使用到的变量的主内存副本拷贝,线程对变量的操做都在工做内存中,而不能直接读写主内存中的变量。性能

1.2 内存见交互操做优化

1.3 volatile变量的特殊规则spa

保证对全部线程有可见性操作系统

禁止指令重排优化线程

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调度的基本单位)

实现线程有三种方法:

一、使用内核线程实现

内核线程 Kernel-level Thread,KLT    直接由操做系统内(Kernel)支持的线程。内核经过操纵调度器(Scheduler)对线程进行调度,并将线程的任务映射到各个处理器上。

支持多线程的内核叫多线程内核 multi-Threads kernel

程序不会直接使用内核线程,并且使用内核线程的一种高级接口---轻量级进程 Light Weight Process  LWP

因为内核线程的支持,每一个轻量级进程都成为一个独立的调度单位,及时有一个轻量进程在系统中阻塞,也不会影响到整个进程的工做。

局限性:基于内核线程实现,各类线程操做,例如建立,析构及同步,都须要进行系统调用。

系统调用的代价享队较高,须要在用户态(User Mode)和内核态(Kernel Mode)中来回切换。其次,轻量进程须要下号必定的内核资源,所以一个系统支持轻量级进程的数量是有限的。

二、使用用户线程实现

广义上来说,一个线程只要不是内核线程,就能够认为是用户线程(User Thread),从这个定义来说,轻量级进程也属于用户进程。

狭义上用户线程指的是彻底创建在用户空间的线程库上,系统内核不能感知线程存在的实现。

若是程序实现得当,这种线程不须要切换到内核态,所以操做能够是很是快速且低消耗的,也能够支持规模更大的线程数量,部分高性能数据库中的多线程就是有用户线程实现的。

因为操做系统只能把处理器资源分配到进程,诸如“阻塞如何处理”,“多处理器系统中如何将线程映射到到其余处理器”,这类问题解决起来异常困难,甚至不可完成。

于是使用用户线程实现的程序通常都比较复杂。

3.使用用户线程加轻量级进程混合实现

操做系统提供支持的轻量级进程做为用户线程和内核线程之间的桥梁,这样内核提供的线程调度功能及处理器映射,而且用户线程的系统调用要经过轻量级线程来完成,下降整个进程被彻底阻塞的风险。

用户线程与轻量级进程的数目比也不必定 N:M

 

2.二、Java线程的实现

 

 2.三、java线程调度

线程调度是指系统为线程分配处理器使用权的过程

协同式线程调度

抢占式线程调度 

Java线程调度式系统自动完成的,可是建议给线程设置优先级。

状态转换:

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

 

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

Blocked(阻塞):程序等待进入同步区域的时候,线程处于这种状态。

相关文章
相关标签/搜索