线程是CPU调度执行的基本单位,多个线程共享系统为进程分配的资源,又可以被系统独立调度执行。

多线程模型

实现多线程主要有3种模型:内核线程模型、用户线程模型、混合线程模型

内核线程模型

内核线程模型即完全依赖操作系统内核提供的内核线程(Kernel-Level Thread ,KLT)来实现多线程。在此模型下,线程的切换调度由系统内核完成,系统内核负责将多个线程执行的任务映射到各个CPU中去执行。

用户进程使用系统内核提供的接口———轻量级进程(Light Weight Process,LWP)来使用系统内核线程。

在此种线程模型下,由于一个用户线程对应一个LWP,因此某个LWP在调用过程中阻塞了不会影响整个进程的执行。

但这种线程模型也有如下缺点:

各种线程的操作都需要在用户态和内核态之间频繁切换,消耗较大

每个LWP都需要一个内核线程来支持执行用户代码,会消耗更多的内核内存空间,因此系统内核提供的KLT的数量是有限制的。

- **用户线程模型**

用户线程模型完全建立在用户空间的线程库上,不依赖于系统内核,用户线程的创建、同步、切换和销毁等操作完全在用户态执行,不需要切换到内核态。

在此种线程模型下,线程的各种操作以及切换消耗很低,但线程的所有操作都需要在用户态实现,线程的调度实现起来异常复杂,处理器映射更是无法实现。

- **混合线程模型**

混合线程模型是前述两种模型的混合版本,用户线程仍然是在用户态中创建,用户线程的创建、切换和销毁的消耗很低,用户线程的数量不受限制。而LWP在用户线程和内核线程之间充当桥梁,就可以使用操作系统提供的线程调度和处理器映射功能。

当前,Java虚拟机使用的线程模型是基于操作系统提供的原生线程模型来实现的,Windows系统和Linux系统都是使用的内核线程模型,而Solaris系统支持混合线程模型和内核线程模型两种实现。

Java线程内存模型

Java线程内存模型中,可以将虚拟机内存划分为两部分内存:主内存和线程工作内存,主内存是多个线程共享的内存,线程工作内存是每个线程独享的内存。

在上图中,方法区和堆内存就是主内存区域,而虚拟机栈、本地方法栈以及程序计数器则属于每个线程独享的工作内存。

Java内存模型规定所有成员变量都需要存储在主内存中,线程会在其工作内存中保存需要使用的成员变量的拷贝,线程对成员变量的操作(读取和赋值等)都是对其工作内存中的拷贝进行操作。

各个线程之间不能互相访问工作内存,线程间变量的传递需要通过主内存来完成。

Java内存模型定义了8种原子操作来实现上图中的线程内存交互:

read,将主内存中的一个变量的值读取出来

load,将read操作读取的变量值存储到工作内存的副本中

use,把工作内存中的变量的值传递给执行引擎

assign,把从执行引擎中接收的值赋值给工作内存中的变量

store,把工作内存中一个变量的值传递到主内存

write,将store操作传递的值写入到主内存的变量中

lock,将主内存中的一个变量标识为某个线程独占的锁定状态

unlock,将主内存中线程独占的一个变量从锁定状态中释放

####原子性、可见性和有序性

- **原子性**

Java内存模型定义了8中原子操作,此外Java内存模型还保证了对于基本数据类型(char、boolean、int等)的操作是原子性的。对于其他类型的数据如若需要更灵活的原子性操作,Java内存模型提供了lock和unlock操作。JVM中使用的两个字节码指令monitorenter和monitorexit即是通过lock和unlock操作来实现的,常使用的synchronized关键字转换成字节码指令后即由monitorenter和monitorexit构成。

可见性

可见性是指当一个线程修改了主内存中变量的值,其他线程可以立即获取这个修改后的新值。只要在工作内存中修改变量之后立即存储到主内存,以及读取一个变量之前强制从主内存刷新变量的值即可保证可见性。volatile关键字即通过上述方法保证多线程操作变量时的可见性。

有序性

有序性是指在同一个线程中的所有操作都是有序执行的,但由于指令重排序等行为会导致指令执行的顺序不一定是按照代码中的先后顺序执行的,在多线程中对一个变量的操作就可能会受到指令重排序的影响。volatile关键字包含有禁止指令重排序的作用,因此使用volatile关键字修饰的变量可以保证多线程之间对该变量操作的有序性。

参考资料:《深入理解Java虚拟机》

java中的线程模型_Java 线程模型相关推荐

  1. java中怎么创建表格_Java中的表格怎么利用表格模型进行创建

    Java中的表格怎么利用表格模型进行创建 发布时间:2020-12-03 16:44:43 来源:亿速云 阅读:89 作者:Leah 本篇文章给大家分享的是有关Java中的表格怎么利用表格模型进行创建 ...

  2. ONNX系列六 --- 在Java中使用可移植的ONNX AI模型

    目录 安装和导入ONNX运行时 载入ONNX模型 使用ONNX运行时进行预测 摘要和后续步骤 参考文献 下载源547.1 KB 系列文章列表如下: ONNX系列一 --- 带有ONNX的便携式神经网络 ...

  3. JAVA中的多线程(八):线程的优先级和yield方法

    JAVA中的多线程(八):线程的优先级和yield方法 优先级代表着抢资源的频率 所有线程默认优先级是5 yield()临时释放线程的执行权 1 class Demo implements Runna ...

  4. Java中进入wait状态的线程被唤醒后会接着上次执行的地方往下执行还是会重新执行临界区的代码

    Java中进入wait状态的线程被唤醒后会接着上次执行的地方往下执行还是会重新执行临界区的代码 用一个例子来说明: 例子原理 启动一个线程A打印数字,从0打印到9,在数字等于5的时候,进入wait状态 ...

  5. JAVA中CyclLink怎么用_Java多线程基本使用一

    1      多线程--初步 [ 1进程 比如:QQ.迅雷.360.飞秋... 2线程的概念 3线程的意义: 4.Java程序的运行原理 代码是运行在线程中的,如果一个进程没有线程,那么进程就结束了, ...

  6. java中的vm自变量_java中JVM虚拟机内存模型详细说明

    java中JVM虚拟机内存模型详细说明 JVM的内部结构如下图: 一个优秀Java程序员,必须了解Java内存模型.GC工作原理,以及如何优化GC的性能.与GC进行有限的交互,有一些应用程序对性能要求 ...

  7. mysql服务器多线程模型_java 线程池、多线程并发实战(生产者消费者模型 1 vs 10) 附案例源码 - 陈彦斌 - 博客园...

    导读 前二天写了一篇<Java 多线程并发编程>点我直达,放国庆,在家闲着没事,继续写剩下的东西,开干! 线程池 为什么要使用线程池 例如web服务器.数据库服务器.文件服务器或邮件服务器 ...

  8. java中多线程编程案例_Java中多线程编程实战的实现线程_Java编程_Java程序员_课课家...

    java编程语言使多线程如此简单有效,以致于某些程序员说它实际上是自然的.尽管在 Java 中使用线程比在其他语言中要容易得多,仍然有一些概念需要掌握.要记住的一件重要的事情是 main() 函数也是 ...

  9. java中的僵死进程_Java中线程间怎么通讯?什么叫僵死线程?

    <尸家保镖> <猛鬼出千> <不死心灵> <大家发财> <灵幻少女> <九天玄女> <僵尸至尊> <湘西尸王& ...

  10. JAVA 继承内存模型_Java内存模型

    JVM的组成 类加载器(classloader) 执行引擎(execution engine) 运行时数据区域(runtime data area) 对于Java程序员来说,在虚拟机自动内存管理机制下 ...

最新文章

  1. Python爬虫之旅_ONE
  2. Loj#2880-「JOISC 2014 Day3」稻草人【CDQ分治,单调栈,二分】
  3. 将所有文件从目录复制到Python中的另一个目录
  4. Python——pip安装报错:is not a supported wheel on this platform
  5. 一个fork的面试题 转
  6. GitHub入门详解
  7. android 按钮点击返回顶部,微信浏览器点击系统返回,安卓返回会重载页面回到页面顶部,iOS则返回则会保留之前浏览位置的解决方法...
  8. 科大讯飞输入法解锁高效语音输入
  9. [SCM]源码管理 - perforce的trigger和daemon
  10. 【空间分析】4 探索性分析
  11. getent passwd 不能访问到 ldap 的用户
  12. n倍角公式的行列式形式与证明
  13. android+键盘键值修改器,键盘按键修改器
  14. Device Tree(五)移植DM9000,并挂载NFS
  15. 【目标检测】|RFB ECCV2018
  16. element-ui的select组件设置预选项没问题,但重新选中不改变的问题解决
  17. FinClip手把手教学:如何从零开始编写一个app
  18. Python乐趣之tkinter欢迎界面
  19. C# DateTime:日期、日期差、时间、时间差
  20. 括号配对检测python123_括_括是什么意思_括字怎么读_括的含义_括字组词-新东方在线字典...

热门文章

  1. HTML如何下载文件
  2. windows蓝屏dump分析方法
  3. 糖豆广场舞完成C轮融资,腾讯、顺为、GGV、IDG投资...
  4. 在vscode中新建html文件的两种方法
  5. java毕业生设计大学生旅游拼团网站计算机源码+系统+mysql+调试部署+lw
  6. 计算机财务模型管理实验内容,财务分析模型实验报告
  7. 机器学习与深度学习视频讲解
  8. adb冲突 傲软_手机投屏到电脑软件
  9. chrome 插件开发中的热更新问题
  10. 阿里云移动推送 - 异常记录