并发的本质是什么?

简介: 并发的本质是什么?

并发的本质是什么?



进程是分配资源的基本单位,线程是调度的基本单位。每个线程有一组寄存器,堆栈,一个程序计数器。

并发的核心是如何处理好多线程的分工,同步和互斥的问题。

并发编程的本质是为了解决:可见性,原子性,有序性三大问题。

并发其实是利用多线程技术,在现代 CPU 的背景下,催生了并发编程的趋势,通过编程编程的形式可以将多核 CPU 的计算能力发挥到极致。


并发的优势


并发编程的优势:并发可以充分利用 CPU 计算能力,提升性能。


并发缺点


在高并发场景下,频繁的上下文切换会损耗性能。临界区线程全问题,线程容易产生死锁。

CPU 通过事件片来循环执行任务。当前任务执行一个时间片后切换到下一个任务,会在切换前保存上一个任务状态,方便切换回这个任务,可以加载这个任务的状态。

640.png


线程


  • 用户线程(User-Level Thread)
  • 内核线程(kernel-Level Thread)


640.png

用户线程


指不需要内核支持而在用户程序中实现的线程,不依赖操作系统核心,应用进程利用线程库提供创建,同步,调度和管理线程的函数控制用户线程。


内核线程


线程的管理操作都由操作系统内核完成。内核保存线程的状态和上下文信息,当一个线程执行了引起了阻塞系统调用时,内核可以调度该进程的其他线程执行,在多线程系统上,内核可以分派系统进程多个处理器运行。

640.png


Java 线程与系统内核线程

640.png


Java 创建线程


new java.lang.Thread().start(),使用JNI将一个native thread attach到JVM中针对 new java.lang.Thread().start()这种方式,只有调用start()方法的时候,才会真正的在JVM中去创建线程

主要的生命周期步骤有

  • 创建对应的JavaThread的instance
  • 创建对应的OSThread的instance
  • 创建实际的底层操作系统的native thread
  • 准备相应的JVM状态,比如ThreadLocal存储空间分配等
  • 底层的native thread开始运行,调用java.lang.Thread生成的Object的run()方法
  • 当java.lang.Thread生成的Object的run()方法执行完毕返回后,或者抛出异常终止后,终止native thread
  • 释放JVM相关的thread的资源,清除对应的JavaThread和OSThread
  • 针对JNI将一个native thread attach到JVM中,主要的步骤有
  • 通过JNI call AttachCurrentThread申请连接到执行的JVM实例


Java 线程的生命周期


640.png



相关文章
|
JSON 前端开发 JavaScript
解锁JSON的奇妙世界:从基础到高级应用,一文搞懂JSON的妙用(上)
解锁JSON的奇妙世界:从基础到高级应用,一文搞懂JSON的妙用(上)
399 0
解锁JSON的奇妙世界:从基础到高级应用,一文搞懂JSON的妙用(上)
|
关系型数据库 MySQL Linux
Python安装mysqlclient报错避坑
MySQL是常用的开源数据库,Python环境下django框架连接MySQL数据库用的是mysqlclient库,今天在用pip安装mysqlclient库时报错,特记录一下,避免后续继续踩坑。
1541 1
|
Java
Java - Java9 之后显示已过时 newInstance() 方法之解决方案
Java - Java9 之后显示已过时 newInstance() 方法之解决方案
929 0
|
6月前
|
人工智能 文件存储 数据中心
Ollama部署本地大模型并通过Infortress APP远程访问保姆级教程
本文介绍如何快速上手本地大模型部署工具Ollama及AI远程访问工具Infortress。通过Ollama,开发者可轻松部署如Llama、Deepseek等主流开源模型,仅需几行命令即可完成安装与运行。结合Infortress,用户能实现对本地大模型的远程访问,支持多设备无缝对接,同时提供便捷的模型切换与知识库管理功能。Infortress更兼具NAS软件特性,成为个人AI数据中心的理想选择。
|
JavaScript 前端开发 安全
怎样用Node.js搭建web服务器
本文探讨了如何使用Node.js构建高效的HTTP服务器。首先,介绍了HTTP常见请求方法,如GET、POST、PUT等。接着,展示了如何使用Node.js的`http`模块创建服务器,并根据请求方法进行不同处理,如判断GET和POST请求,以及获取GET请求参数和处理POST请求数据。最后,讨论了服务器代码的模块化管理,包括路由管理和业务逻辑拆分,以提升代码的维护性和扩展性。通过本文,读者可以掌握基础的Node.js服务器开发及模块化设计技巧。
290 0
|
存储 缓存 Java
volatile关键字最全原理剖析
【9月更文挑战第27天】`volatile` 是一个用于修饰变量的关键字,告知编译器被修饰的变量可能在程序控制流之外被改变。在多线程环境下,`volatile` 确保变量的值每次从内存中读取,保持最新状态,但不能解决所有同步问题。在硬件交互中,`volatile` 用于内存映射的 I/O 操作,确保读取最新值。不同编程语言如 C/C++ 和 Java 中的 `volatile` 用法略有差异,但都是处理易变变量的重要工具。
272 5
|
Java 程序员 编译器
Java|如何正确地在遍历 List 时删除元素
从源码分析如何正确地在遍历 List 时删除元素。为什么有的写法会导致异常,而另一些不会。
356 3
|
移动开发 小程序 数据可视化
基于npm CLI脚手架的uniapp项目创建、运行与打包全攻略(微信小程序、H5、APP全覆盖)
基于npm CLI脚手架的uniapp项目创建、运行与打包全攻略(微信小程序、H5、APP全覆盖)
2349 3
|
前端开发 JavaScript
如何实现瀑布流排列方式
如何实现瀑布流排列方式
143 0
|
人工智能 API 语音技术
[AI MoneyPrinterTurbo] 一键成片,超级印钞机
探索MoneyPrinterTurbo的奇妙旅程,一个文生视频工具,让您只需一键,就能体验从安装到配置,再到创建高清短视频的全过程。
[AI MoneyPrinterTurbo] 一键成片,超级印钞机

热门文章

最新文章