java内存区 || 并发

news2024/10/6 6:39:53

目录

什么是线程?

线程的创建和上下文切换:

线程的入栈和出栈:

堆栈的作用:

CPU核心数概念

线程的start状态

就绪队列

操作系统的时间片

线程中代码执行顺序

实际中内存图


什么是线程?

  1. 线程的创建和上下文切换:

    • 创建线程:线程的创建是通过调用操作系统提供的线程创建函数或类似机制来完成的。当创建一个线程时,操作系统会为它分配独立的堆栈内存区域,并为其设置一个唯一的标识符。同时,该线程也会共享进程的其他资源,如内存、文件描述符等。
    • 上下文切换:在多线程环境下,操作系统会根据一定的调度策略来决定使用哪个线程执行,这个过程称为上下文切换。上下文切换涉及到将当前线程的上下文(包括程序计数器、寄存器值等)保存起来,然后恢复切换到的线程的上下文。
  2. 线程的入栈和出栈:

    • 入栈过程:当线程被调度执行时,它的执行流会从当前程序指令流入栈,即将当前执行点(例如程序计数器)推入线程的堆栈中。这样可以保留当前执行点,以便在上下文切换后能够恢复到正确的执行点。
    • 出栈过程:当一个线程的执行结束或被调度让出执行权时,它的执行流会从堆栈中弹出,即将保存的执行点弹出,恢复到之前的执行点,并在适当的位置继续执行。
  3. 堆栈的作用:

    • 堆栈的主要作用是存储线程执行过程中的局部变量、函数调用信息以及控制流相关的上下文信息。每个线程都有自己的堆栈,以保证线程之间的数据隔离和独立性。
    • 堆栈还用于存储函数调用的参数和返回地址,在函数调用时,参数会被压入堆栈,函数执行完毕后,根据返回地址可以将控制流返回到调用者的正确位置。

CPU核心数概念

CPU的核心某一时刻只能够执行一个任务

如果有多个线程的话 ,他们就会立刻去抢占cpu

  1. 并行执行:如果CPU拥有多个核心,每个核心都可以并行执行不同的任务。这意味着在具有多个核心的系统中,多个线程可以同时运行在不同的核心上,从而实现并行计算和执行多个任务。

  2. 进程和线程的调度:当有多个线程需要执行时,操作系统的调度器会根据一定的策略将线程分配到不同的核心上运行。调度器通常基于一些算法,如时间片轮转或优先级来确定哪个线程被调度到哪个核心上。这样可以实现多个线程的并发执行。

  3. 线程抢占:当多个线程同时竞争同一个核心时,操作系统可以通过线程调度机制来实现线程的抢占。线程抢占是指当一个线程占用了核心时,如果拥有更高优先级的线程需要执行,操作系统可以暂停当前线程的执行,并切换到更高优先级的线程去执行。这种方式可以实现对CPU资源的公平分配,确保高优先级的任务能够及时执行。

线程的start状态

.start()只是让线程进入就绪态,然后交由操作系统去管理,它会先放入就绪队列,然后操作系统进行选择去执行

就绪队列

任何预言中的线程都只是提交到操作系统中的就绪队列,不可能让他立刻执行

操作系统中的就绪队列并不是一个先进先出的队列,也就是说先进入就绪态的方法不一定先被执行

操作系统的时间片

就绪队列中的任务被选中的时候,,操作系统就会同时分配一个执行时间,如果在时间内没有执行完,就保留当前状态并去执行其他线程,不会让一个线程一直霸占着资源

这也就导致了 先就绪的线程但不一定是先执行完的

线程中代码执行顺序

同一个线程中肯定是从上向下开始执行的

不同的线程中,代码执行顺序是不一样的

实际中内存图

public class Person {
    public void m1(){}
    public void m2(){
        m3();
    }
    public void m3(){}
}

 

public class Test {
    public static void main(String[] args) throws Exception{
        // TODO Auto-generated method stub
        Thread x1 = new Thread() {
            @Override
            public void run() {
                Person w1 = new Person();
                w1.m2();
            }
        };
        Thread x2 = new Thread() {
            @Override
            public void run() {
                Person w1 = new Person();
                w1.m3();
            }
        };
        ///=====
        x1.start();
        x2.start();

        Person w1 = new Person();
        w1.m1();
    }

 当Test运行的时候,内存中是这样子的

 

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

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

相关文章

【android12】给第三方应用APK添加系统签名

一、背景 自己或者客户的第三方apk需要用到很多系统权限,所以要内置到系统目录下,变成系统自带的APP,如果不用系统文件生成的签名安装,会导致APP远程更新失败提示签名错误。 二、环境准备 1.Ubuntu系统(推荐1804版本及…

Invalid name=“org.apache.dubbo.config.ApplicationConfig#0“

上一篇文章是springboot 集成 dubbo: spring boot 集成dubbo_Demonor_的博客-CSDN博客 在集成的时候出现了一些异常,在这里记录一下,并排查出原因 异常信息1: [2m2023-07-11 20:38:39.387[0;39m [32m INFO[0;39m [35m21492[0;…

92.qt qml-日期/日期时间/时间选择器(日历选择器)

截图如下所示: 效果图如下所示: 1.前言 QML日历组件我们之前移植过: 67.qt quick-qml自定义日历组件(支持竖屏和横屏)_qml日历_诺谦的博客-CSDN博客 但是该组件内部代码比较坑的就是全部使用自定义对象,导致性能不行,动画卡顿,并且不好加时间选择,所以本章我们重新学…

Mysql 实现批量插入对已存在数据忽略或更新

Mysql 实现批量插入对已存在数据忽略/更新 文章目录 Mysql 实现批量插入对已存在数据忽略/更新一. 表的准备二. 实现2.1 实现原理2.2 批量插入对已存在数据忽略 一. 表的准备 CREATE TABLE demo (id int NOT NULL AUTO_INCREMENT COMMENT 主键id,name varchar(10) DEFAULT NUL…

重磅IntelliJ IDEA 2023.2 新版本即将发布,拥抱 AI

IntelliJ IDEA 近期连续发布多个EAP版本,官方在对用户体验不断优化的同时,也新增了一些不错的功能,尤其是人工智能助手补充,AI Assistant,相信在后续IDEA使用中,会对开发者工作效率带来不错的提升。 以下是…

基于A*的二维多无人机航线规划

Matlab航迹规划仿真——A*算法_航迹起始算法 matlab_致守的博客-CSDN博客 matlab2016及以上可以运行 astar.m function [] astar(Spoint,Epoint,Matrix,m,n,h1,h2) %%寻路 Matrix(Spoint(1),Spoint(2))0; Matrix(Epoint(1),Epoint(2))inf; GMatrix; FMatrix; openlistMatri…

安全防御 --- DDOS攻击(01)

DOS攻击(deny of service)--- 拒绝式服务攻击 例:2016年10月21日,美国提供动态DNS服务的DynDNS遭到DDOS攻击,攻击导致许多使用DynDNS服务的网站遭遇访问问题,此事件中,黑客人就是运用了DNS洪水…

ceph--RBD的使用

Ceph-RDB 1、RBD架构图 Ceph 可以同时提供对象存储 RADOSGW、块存储 RBD、文件系统存储 Ceph FS,RBD 即 RADOS Block Device 的简称,RBD 块存储是常用的存储类型之一,RBD 块设备类似磁盘 可以被挂载,RBD 块设备具有快照、多副本、克隆和一致…

今天实习第一天,用git

老板问了我是否用过gitee,并且是否用过git,在集成工具中,会git来提交代码。我说没有。 所以,先使用gitee。 01.登录gitee的官网,在此处登录。 02.绑定邮箱,我用的是QQ邮箱。

服务端研发提测模板

test环境分支自测通过 提测邮件标注test环境分支 【xxxxxx需求】服务端研发提测了,快去测试吧!

vue3中的provide

作用:实现祖孙件通信套路:父组件有一个provide选项来提供数据,子组件有一个inject选项来开始使用这些数据具体写法: 祖组件中: <template><div class"lim"><h2>祖组件</h2><child></child>名字:{{ car.name }}<br>价格:…

SpringBoot与Vue前后端分离项目。用Nginx代理。

Nginx代理主要是解决跨域与负载均衡的作用。 我这里用的自己的电脑&#xff0c;用的windows系统&#xff0c;不过配置基本是和Linux一样的。 下载Nginx nginx: download Nginx常用命令&#xff0c;先cd到解文件夹路径&#xff1a; nginx.exe&#xff1a;开启服务。nginx -s…

预训练模型相关整理

1、怎么使用预训练网络&#xff1f; 使用预训练网络有两种方法&#xff1a;特征提取&#xff08;feature extraction&#xff09;和微调模型&#xff08;fine-tuning&#xff09;。 1、特征提取 特征提取是使用之前网络学到的表示来从新样本中提取出有趣的特征。然后将这些特…

深入理解Linux网络——内核是如何发送网络包的

文章目录 一、相关实际问题二、网络包发送过程总览三、网卡启动准备四、数据从用户进程到网卡的详细过程1&#xff09;系统调用实现2&#xff09;传输层处理1. 传输层拷贝2. 传输层发送 3&#xff09;网络层发送处理4&#xff09;邻居子系统5&#xff09;网络设备子系统6&#…

【微信小程序创作之路】- 小程常用页面样式

【微信小程序创作之路】- 小程常用页面样式 第四章 微信小程序用页面样式 文章目录 【微信小程序创作之路】- 小程常用页面样式前言一、总体样式--全局样式and局部样式1.全局样式2.局部样式 二、Flex布局&#x1f349;&#x1f349;&#x1f349;rpx单位 三、样式导入四、常用…

unpkg 与 npm 的基本介绍

目录 定义 特点 原理 使用 npm安装流程 npm install npm update registry 区别 总结 定义 UNPKG是一个基于npm registry 的静态资源 CDN 服务&#xff0c;它可以快速获取和使用任何JavaScript包&#xff0c;无需安装任何软件或包。UNPKG可以从NPM仓库中获取任何包&am…

不受环境干扰,这套声学全息方案实现了虚实交互

一谈到全息显示&#xff0c;大家默认想到的就是光学全息方案&#xff0c;比如需要将光投射到某样东西上&#xff0c;比如视网膜&#xff0c;或是烟雾等介质上&#xff0c;才能成像。市面上一些常见的2D、3D全息方案&#xff0c;如全息风扇、Voxon全息系统等等&#xff0c;分别采…

【STM32MP135】修复10.1寸屏显示异色问题,添加极性配置

文件路径&#xff1a;u-boot-stm32mp-v2021.10-stm32mp1-r1/drivers/video/stm32/stm32_ltdc.c

代码随想录算法训练营第17期第14天 | 理论基础 、递归遍历、迭代遍历、统一迭代

理论基础 种类 满二叉树、完全二叉树、二叉搜索树 满二叉树 如果一颗二叉树只有度为0的节点和度为2的节点&#xff0c;并且度为0的节点都在同一层 完全二叉树 在完全二叉树中&#xff0c;除了最底层节点可能没填满外&#xff0c;其余每层节点数都达到最大值&#xff0c;并…

Android Java代码与JNI交互 引用类型转换(五)

🔥 Android Studio 版本 🔥 🔥 Java中基础数据类型对应Native的数据类型 🔥 * Java中基础数据类型对应Native中的数据类型* |Java |Native |* |boolean |jboolean |* |byte |jbyte |* |short |jshort |* |int |jint |* |long…