Java内存模型与线程

Posted 背时的哥哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java内存模型与线程相关的知识,希望对你有一定的参考价值。

1.主内存与工作内存

Java内存模型的主要目的是定义程序中各种变量的访问规则,即关注在虚拟机中把变量值存储到内存和从内存中取出变量值。此处的变量与Java编程中的所说的变量有所区别,它包含了实例字段,静态字段和构成数组对象的元素,单实不包括局部变量与方法参数,因为后者是线程私有的,不会被共享。
Java内存模型规定了所有的变量都存储在主内存中,每条线程有自己的工作内存,线程的工作内存中保存了被该线程使用的变量的主内存副本,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的数据。不同线程之间也无法直接访问对方的工作内存中的变量。

2.lock&unlock

①如果对一个变量执行lock操作,那么会清空内存中此变量的值,在执行引擎使用这个变量前,需要重新执行load或assign操作以初始化变量的值;
②对一个变量执行unlock操作之前,必须先把次变量同步回主内存中;

3.volatile

特性: ①保证此变量对所有线程的可见性;
②禁止指令重排优化;

4.Java线程

线程是Java进行资源调度的最基本单位。
实现线程的三种方式:
①内核线程实现(Java线程的实现):内核线程就是直接由操作系统内核支持的线程,这种线程由内核来完成线程切换,内核通过操纵调度器来对现场进行调度,并负责将线程任务映射到各处理器上。
由于内核线程的支持,每个轻量级进程都称为一个独立的调度单元,即使其中某一个轻量级进程在系统调用中被阻塞了,也不会影响整个进程继续工作。
局限性:由于是基于内核线程实现的,所以各个线程操作都需要进行系统调用,而系统调用的代价相对较高,需要在用户态和内核态中来回切换,其次每个轻量级进程都对应一个内核线程的支持,因此其要消耗一定的内核资源。
②用户线程实现:完全建立在用户空间的线程库上;
③混合实现;

以上是关于Java内存模型与线程的主要内容,如果未能解决你的问题,请参考以下文章

JAVA内存模型与线程以及volatile理解

Java内存模型与线程

Java内存模型与线程

Java内存模型与线程

Java 多线程与并发:内存模型

并发编程3:深入理解Java虚拟机_内存模型与线程-JAVA内存模型