【并发】深入理解Java线程的底层原理

news2024/11/25 14:30:22

线程基础知识

线程与进程

进程

操作系统会以进程为单位分配系统资源(CPU时间片、内存等资源),进程是资源分配的最小单位

当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程

线程

线程,有时被称为轻量级进程,是操作系统调度(CPU调度)执行的最小单位

线程是进程中的实体,一个进程可以拥有多个线程一个线程必须有一个父进程

一个线程就是一个指令流,将指令流中的一条条指令以一定的顺序交给 CPU 执行 。

【面试题】进程与线程的区别

(1)进程基本上相互独立的,而线程存在于进程内,是进程的一个子集

(2)进程拥有共享的资源,如内存空间等,供其内部的线程共享

(3)进程通信较为复杂

  • 同一台计算机的进程通信称为 IPC(Inter-process communication)
  • 不同计算机之间的进程通信,需要通过网络,并遵守共同的协议,例如 HTTP

(4)线程通信相对简单,因为它们共享进程内的内存,一个例子是多个线程可以访问同一个共享变量

(5)线程更轻量线程的上下文切换成本更低

进程间通信的方式

相信大学期间有准备过408的小伙伴应该很熟悉!大致是有6种方式。

1. 管道(pipe)及有名管道(named pipe):管道可用于具有亲缘关系的父子进程间的通信,有名管道除了具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。

2. 信号(signal):信号是在软件层次上对中断机制一种模拟,它是比较复杂的通信方式,用于通知进程有某事件发生,一个进程收到一个信号与处理器收到一个中断请求效果上可以说是一致的

3. 消息队列(message queue):生产者与消费者之间的通信

4. 共享内存(shared memory):可以说这是最有用的进程间通信方式。它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据得更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等。

5. 信号量(semaphore):主要作为进程之间及同一种进程的不同线程之间得同步和互斥手段。(线程级别也可以!)

6. 套接字(socket):这是一种更为一般得进程间通信机制,它可用于网络中不同机器之间的进程间通信,应用非常广泛。

在开发中有一个很常见的场景,就是分布式锁(redis,mysql,zk)进程与进程之间通信也可以通过操作共享内存的方式去实现。

线程的同步互斥

线程同步

是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达才被唤醒

举一个例子

我们开发一个网页,用户在浏览器操作,浏览器就会向Tomcat服务器发请求,Tomcat可以将请求转发到一个具体的应用(应用中也有线程),可能会去查MySQL数据库。

浏览器线程、tomcat线程、应用中的线程、数据库线程,它们之间相互协作去完成请求与响应,这其实就是一个同步的过程。 

线程互斥

线程互斥对于共享的进程系统资源,在各单个线程访问时的排它性。当有若干个线程都要使用某一共享资源时,任何时刻最多只允许一个线程去使用(例如:synchronized ,其它要使用该资源的线程必须等待,直到占用资源者释放该资源。线程互斥可以看成是一种特殊的线程同步

上下文切换

上下文切换是指CPU(中央处理单元)从一个进程或线程到另一个进程或线程的切换

上下文切换步骤

  1. 暂停一个进程的处理,并将该进程的CPU状态(即上下文)存储在内存中的某个地方
  2. 从内存中获取下一个进程的上下文,并在CPU的寄存器中恢复
  3. 返回到程序计数器指示的位置(即返回到进程被中断的代码行)以恢复进程。

上下文切换只能在内核模式下发生。

内核模式是CPU的特权模式,其中只有内核运行,并提供对所有内存位置和所有其他系统资源的访问。

其他程序(包括应用程序)最初在用户模式下运行,但它们可以通过系统调用运行部分内核代码。 

【面试题】什么情况下会发生上下文切换? 

  • 线程、进程切换
  • 系统调用,当发生某些预先不可知的异常时,就会切换到内核态,以执行相关的异常事件。
  • 中断,在使用外围设备时,如外围设备完成了用户请求,就会向CPU发送一个中断信号,此时,CPU就会暂停执行原本的下一条指令,转去处理中断事件。此时,如果原来在用户态,则自然就会切换到内核态。

具体看这里:

内核模式(Kernel Mode)vs 用户模式(User Mode)  

操作系统层面线程生命周期

操作系统层面的线程生命周期基本上可以用下图这个“五态模型”来描述。这五态分别是:初始状态、可运行状态、运行状态、休眠状态和终止状态

这个五态模型也是我们之前学习操作系统的时候课本里面讲的(当然还有“七态模型”)。

这里我们直接用网图: 

五态模型

七态模型

但是需要注意的是,不同的语言规范,这些状态模型的数量、名称都会发生改变!!!我们这里就用Java为例

Java中的状态模型

Thread源码可以发现,在Java中线程一共有6种状态 

public enum State {

        // 创建态
        NEW,

        // 运行态 + 就绪态
        RUNNABLE,

        // 阻塞态(synchronized)
        BLOCKED,

        // 等待(join、wait、park)
        WAITING,

        // 有时限的等待(sleep)
        TIMED_WAITING,

        // 终止态
        TERMINATED;
}

Java线程详解

Java线程的实现方式

Java线程实现原理

Java线程的调度机制

Java线程的生命周期

Thread常用方法

Java线程的中断机制

Java线程间通信

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/48548.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LDcad零件新增与导入

LDcad大颗粒小颗粒套装导入方法,以后LDcad也可以用套装搭建模型了。 LDcad大颗粒小颗粒套装导入方法, 以后LDcad也可以用套装搭建模型了。 有个遗憾,就是零件不全。 具体导入方法看下文。 我们可以看到。这些套装都有对应的图标。方便…

环境温湿度在线监测如何实现?有何应用场景?

温度、湿度等环境数据与人们生活生产息息相关。温湿度传感器作为能将温度量和湿度量转换成容易被测量处理的电信号的设备或装置,广泛应用于工农业生产、气象、环保、国防、科研等经常需要对环境或设备的温度与湿度进行测量的领域,因此也产生了对温湿度远…

ASP.NET Core 3.1系列(15)——Entity Framework Core之DB First

1、前言 本文开始介绍一些关于Entity Framework Core的内容。在EFCore中,常用的为DB First模式和Code First模式,下面就来介绍一下如何在EFCore中使用DB First模式生成实体类和数据库上下文。 2、创建测试数据库 在SQL Server中新建一个数据库Dao&…

2016-04《信息资源管理 02378》真卷解析,逐题解析+背诵技巧

本系列博客合计 21 篇,每篇都将解析一张《信息资源管理》真卷,并附带答案解析与背诵技巧。 全国 2016 年 4 月自学考试信息资源管理试题(02378) 单选题 1、按信息表现形式划分,信息可分为(C) …

JavaScript的Web api接口

JavaScript的Web api 文章目录JavaScript的Web api选中元素事件操作元素获取/元素内容获取/修改元素属性获取/修改表单元素属性实现一个显示/隐藏 密码的功能实现一个加减计算器复选框全选/全不选获取/修改样式属性点击文字放大字体实现白天模式与夜间模式的切换操作节点新增节…

【附源码】计算机毕业设计JAVA住房公积金筹集子系统的网站系统

【附源码】计算机毕业设计JAVA住房公积金筹集子系统的网站系统 目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术&#xf…

3D漫游:所见即所得的形式,构建线上数字展厅

企业在数字化转型的大环境下,较为常用的当属数字展厅了,数字展厅能够为企业、行业协会、展销基地以及体验中心助力,以所见即所得的形式构建线上数字空间,满足企业的数字化展示和数字化营销。3D漫游,更加沉浸式的三维空…

使用 Hibernate Envers 进行实体审计

业务应用程序中的常见要求是在特定数据更改时存储版本控制信息;当某事发生变化时,谁改变了它,改变了什么。在这篇博文中,我们将介绍Hibernate Envers,它是Hibernate JPA库的一个组件,它为实体类提供了一个简单的审计/版…

【Linux网络配置实战】服务器Network静态路由配置

【Linux网络配置实战】服务器Network静态路由配置一、环境介绍1.环境规划2.实验目的二、检查各节点IP地址1.检查server01服务器上2.检查server02服务器网卡3.检查route01上的网卡三、在route01上启动IP包转发四、查看当前两节点互通情况1.查看server01和server02连通状态2.查看…

新手小白可以做什么互联网项目,副业项目应该怎么选择

现在网上的信息这么冗杂,有没有可靠的副业项目呢?怎样才能找到适合自己的副业呢? 说实话,在网上找副业并不难,搜索一下就会出来很多,但新手小白不知道如何选择,导致焦虑,一个重要的…

helm2.0安装及部署

一、helm简介 Helm是Deis (https://deis.com/) 开发的一个用于kubernetes的包管理器。每个包称为一个Chart,一个Chart是一个目录(一般情况下会将目录进行打包压缩,形成name-version.tgz格式的单一文件,方便传输和存储&#xff09…

Linux 如何设置代理

安装部署 clash 是一款用 Go 语言开发的软件,所以我可以直接下载预编译的版本进行部署。 下载地址:https://github.com/Dreamacro/clash/releases/download/v1.8.0/clash-linux-amd64-v1.8.0.gz软件的作者提供了多种架构下预编译的二进制文件&#xff0…

67 - 经典问题解析五(指针的判别 构造中的异常)

---- 整理自狄泰软件唐佐林老师课程 1. 问题一 编写程序判断一个变量是不是指针&#xff1f; 1.1 指针的判别 C中仍然支持C语言中的可变参数函数C编译器的 匹配调用 优先级&#xff1a;重载函数 > 函数模板 > 变参函数 #include <iostream> #include <strin…

16-JavaSE基础巩固项目:拼图小游戏

阶段项目-拼图小游戏 一、项目介绍 1、目的 锻炼逻辑思维能力&#xff0c;让我们知道前面学习的知识点在实际开发中的应用场景。 1、为了学习一个新知识&#xff1a;GUI GUI全称&#xff1a;Graphical User Interface&#xff08;又称图形用户接口&#xff09;是指采用图形化…

三维地质建模数据处理

三维地质建模计算在地质工程、地球物理、矿产勘查等领域获得了广泛的应用&#xff0c;常用软件包括GOCAD、Surpac、XModel、DMine等。通过三维地质建模&#xff0c;既可以表达空间几何对象&#xff0c;也可以表现空间属性分布&#xff0c;进而实现地下三维空间可视化、地质解释…

win11 L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到了一个处理错误

连接公司内网遇到的问题。。。。修改了&#xff08;不是翻墙&#xff0c;审核一下&#xff09; 在所有情况之前先尝试用手机热点试一下&#xff0c;排除网络问题&#xff0c; 今天遇到就移动的热点WiFi登不上公司内网&#xff0c;电信联通都行 所以先试试换个运营商热点看看…

springboot项结构分析

三. SpringBoot 结构 3.1.SpringBoot 工作原理 Spring boot应用程序采用各种Starters启动器,入口类是包含SpringBootApplication注解和main方法的类,然后使用ComponentScan注解自动扫描项目中的所有组件,并且Spring Boot会根据EnableAutoConfiguration注解将项目中的依赖项自…

redis基础1——发展历程+源码安装及配置+基本常识

文章目录一、NOSQL概述1.1 单机Mysql的演进1.2 什么是Nosql1.3 Nosql的四大分类1.3.1 KV键值对型1.3.2 文档型数据库&#xff08;bson格式&#xff0c;和json一样&#xff09;1.3.3 列存储数据库1.3.4 图数据库二、redis安装与配置2.1 redis概述2.2 Windows安装2.2.1 安装至win…

【项目实战:核酸检测平台】第四章 冲锋陷阵

项目实战&#xff1a;核酸检测平台第四章 冲锋陷阵 摘要&#xff1a;战争&#xff0c;冲在最前面的永远是最危险的人群&#xff0c;新冠之战&#xff0c;冲在最前的则是医护人员、防疫工作者。 核酸检测平台的采集人员APP做为先头部队的重要武器&#xff0c;一定要做的好用、…

JVM之运行时数据区 PC、虚拟机栈、本地方法栈

JVM之运行时数据区 PC、虚拟机栈、本地方法栈PC寄存器线程回顾寄存器实践面试使用PC寄存器存储字节码指令地址有什么用&#xff1f;为什么使用PC寄存器记录当前线程的执行地址PC寄存器为什么会被设定为线程私有虚拟机栈虚拟机栈出现背景简介栈可能出现的异常栈中存储着什么运行…