Java并发编程(上)

并发:多个线程(进程)竞争一个资源

并行:多个线程(进程)同时运行不同资源

线程和进程的关系简单地说,进程是一个容器,一个进程中可以容纳若干个线程,一个进程里面,至少有一个线程

跨系统的并发实现底层原理需要更好的机器来实现,不是跨系统的就是调用**操作系统的CAH**来实现,如下图所示

线程的状态

- 新建--就绪--运行--阻塞--等待---死亡
- 就绪队列、阻塞队列、等待队列

- 一个线程申请资源时,无法让其马上执行,而是先进入队列变为就绪态,然后等待资源分配,若马上就让其直接执行,会导致之前正在执行的进程中断、丢失

- 和操作人员交互多的指令,在运行时优先级越高、响应也越迅速

- 每个进程在CPU中分配的时间片是不同的,当该进程的时间片用完且该进程还没完成时就会中心进入就绪态,等待下一次执行,直到完成为止,同时,若一个进程在分配的时间还没用完就已经完成,此时CPU会马上切换任务,不会休息(比如进程A共需要5ms,但是cpu分配了10,此时在执行到5ms时,CPU便不再处理A,转而执行B),另外,只有没有任何进程时,CPU才会休息

- 不同的系统,每次为进程分配的时间片方式不同,一般是随机的,也有等长的,比如linux

- 在操作系统中,每个进程是否可以进入就绪、运行是靠优先级决定的,具体如何计算优先级每个系统的方法可能不一样,主要方法有优先级队列、等待响应比等

- 当一个进程的时间片用完,操作系统会记录此时的状态(即执行到哪里,也就是执行到的地址)和下一次执行时间,以便下一轮时间片到的时候可以继续执行

- 操作系统选中哪个线程去执行是不确定的,是随机的

- 进程执行完后进入死亡状态,时间片用完重新回到就绪态

- 阻塞队列:竞争枷锁资源失败的时候进程A就会进入阻塞队列,若某一刻被竞争的资源被正在占用的进程B释放,此时A又可以进去就绪队列竞争资源

- 等待队列:一个处于等待队列的进程A是不会自己接触等待状态的,只有当别人唤醒时,他才能进入就绪态去竞争资源,同时一个进程可以自己进入等待队列,正在执行的进程也可以自己进入等待队列

- 先进入就绪态的被先执行的概率越大,但不是百分之百,后进入就绪态的可能比先进入的更早执行

- 在线程完定义的变量,若需要出现在线程内,则该线程会默认的将该变量认为是final修饰的,此时若该变量是基本数据类型,则不能重新赋值,若是引用变量,则指向不能改变,但是内容可以改变

int a=10;
int[] arr = {0};
Thread x1 = new Thread(){a=100;	//错误@Overridepublic void run(){arr[0] = 100; 	//不报错,因为指向没有变}
};

在有多个线程时,main线程会最先执行,然后是剩下的线程平等的竞争CPU,每个线程之间都是互不等待的,例如:

- 在上述代码中,arr[0]大概率是0,因为main先执行,当x1与x2进入就绪态时,分配给main的时间片可能还未用完,便会直接执行输出,但这是大概率,也有可能在main线程未执行到输出时时间片用完,此时arr[0]就会改变
- 若此时,我们加上join,就会取消掉互不等待,

此时,x1执行完之后,x2才会执行,最后是输出,注意,x1.join()执行,只是让其之后的等待,但x2是在x1.join()之前进入的就绪态,所以此时并不会让x2线程中的内容停止执行,这时候就是竞争CPU了

- 从严格的物理上讲,同一时刻只能有一个线程对变量进行操作,但是当我们有了告诉缓存后,只有在第一次对其执行的时候需要占用总线,剩下的只需要在缓存中操作即可,大大加快了速度与并发效率,但是,特也产生了并发问题
  - 比如上述的两个线程对arr[0]进行+1操作,可能会有多种情况,但是最后arr[0]的结果只能是小于等于20000的,最小的结果是1
- 那么如何解决并发问题呢?
  - 锁机制
    - synchronized    重量级重入锁,
      - 当synchronized锁静态方法时,锁的是该方法,如果别人想要调用,就要先加锁,且每次调用都要加锁,想调用,就加锁

上下文切换

**多线程一定比单线程快吗?**

- 不一定,因为有上下文切换
- 在产生CPU浪费的情况下,多线程合适,无浪费的情况下,单线程合适
- 在执行的操作次数越多,多线程就越快,次数越少,单线程相比更快,如下图:

原因:因为线程有创建和上下文切换的开销

当执行的操作次数很少时,CPU的使用率与多线程时相差不多,但是多线程会有一个创建和上下文切换的开销,所以总的时间就会变长;当执行操作次数很多时,单线程就会因为IO的时间而导致CPU在这期间会“发呆”(没有操作来使用CPU),导致CPU的使用率大大降低,而多线程在出现IO时并不会等待IO的结束,而是会直接执行其他操作,只要该操作的CPU使用时间完成,就直接让下一个操作来占用CPU,此时CPU就会不间断的工作起来,不再休息

- 线程性能测量工具
  - 使用Lmbench3来测量上下文切换的时长
  - 使用vmstat可以测量上下文切换的次数
- 如何减少上下文切换的次数
  - 无锁并发编程:多线程竞争锁时,会引起上下文切换,所以多线程处理数据时,可以用一 些办法来避免使用锁,如将数据的ID按照Hash算法取模分段,不同的线程处理不同段的数据
  - CAS算法:Java的Atomic包使用CAS算法来更新数据,而不需要加锁
  - 使用最少线程数:避免创建不必要的线程。比如任务很少但是创建的线程很多
  - 协程
- 减少上下文切换的实战
  - 通过减少线上大量WAITING的线程,来减少上下文切换次数
    - 第一步:用jstack命令dump线程信息(jsatck指令)
    - 第二步:统计所有线程分别处于什么状态(grep指令)
    - 第三步:打开dump文件查看处于WAITING(onobjectmonitor)的线程在做什么
    - 第四步:减少JBOSS的工作线程数,找到JBOSS的线程池配置信息,将maxThreads降到 100
    - 第五步:重启JBOSS,再dump线程信息,然后统计WAITING(onobjectmonitor)的线程(WAITING的线程少了,系统上下文切换的次数就会少,因为每一次从 WAITTING到RUNNABLE都会进行一次上下文的切换)

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

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

相关文章

微信小程序入门

创建一个入门程序 这是index.vxml代码 <!--index.wxml--> <navigation-bar title"Weixin" back"{{false}}" color"black" background"#FFF"></navigation-bar> <view class"container" ><view&…

苹果CMS:资源采集站如何设置定时采集详细教程讲解

我们搭建好站点之后&#xff0c;会自定义一些采集&#xff0c;但是需要每天去手动执行&#xff0c;有时候甚至会忘记&#xff0c;那我们如何处理呢&#xff1f;今天我们就来介绍一下如何设置定时器。 如果按照官方例子来设置定时器会遇到一个问题就是采集的资源未绑定类型&…

WAF+API安全代表厂商|瑞数信息入选IDC报告《生成式AI推动下的中国网络安全硬件市场现状及技术发展趋势》

近日&#xff0c;全球领先的权威资讯机构IDC正式发布《IDC Market Presentation&#xff1a;生成式AI推动下的中国网络安全硬件市场现状及技术发展趋势&#xff0c;2024》报告。报告中IDC 评估了众多厂商的安全硬件产品能力&#xff0c;并给出了产品对应的推荐厂商供最终用户参…

04 | 深入浅出索引(上)

此系列文章为极客时间课程《MySQL 实战 45 讲》的学习笔记&#xff01; 索引的常见模型 可以提供查询效率的数据结构有很多&#xff0c;常见的有三种&#xff1a;哈希表、有序数组、搜索数。 哈希表是一种以 key-value 形式存储的数据结构。输入一个 key&#xff0c;通过固定…

强烈推荐java人,2024年大厂面试背这份(八股文+场景题结合)!很管用!

2024 年的行情&#xff0c;和 3~4 年前不同&#xff0c;通过海量简历投递和海量面试找工作的时代已经过去了。 在如今面试机会较少&#xff0c;并且面试难度较大的情况下。 充分做好面试的准备才是快速通过面试最有效的方法&#xff01; 切忌把真实面试当靶场&#xff0c;最…

信息学奥赛初赛天天练-48-CSP-J2020完善程序2-变量交换、冒泡排序、贪心算法、最小区间覆盖

PDF文档公众号回复关键字:20240728 2020 CSP-J 完善程序2 1 完善程序 (单选题 &#xff0c;每小题3分&#xff0c;共30分) 最小区间覆盖 给出 n 个区间&#xff0c;第 i 个区间的左右端点是 [ai,bi]。现在要在这些区间中选出若干个&#xff0c;使得区间 [0, m] 被所选区间的…

前端框架 element-plus 发布 2.7.8

更新日志 功能 组件 [级联选择器 (cascader)] 添加持久化属性以提升性能 (#17526 by 0song)[日期选择器 (date-picker)] 类型添加月份参数 (#17342 by Panzer-Jack)[级联选择器 (cascader)] 添加标签效果属性 (#17443 by ntnyq)[加载 (loading)] 补充加载属性 (#17174 by zhixi…

第九讲 后端1

后端&#xff08;Backend&#xff09; 用带噪声的数据估计内在状态&#xff08;Estimated the inner state from noisy data&#xff09;——状态估计问题渐进式&#xff08;Incremental&#xff09;&#xff1a;保持当前状态的估计&#xff0c;在假如新信息时&#xff0c;更新…

【算法专题】双指针算法之18. 四数之和(力扣)

欢迎来到 CILMY23的博客 &#x1f3c6;本篇主题为&#xff1a;双指针算法之18. 四数之和&#xff08;力扣&#xff09; &#x1f3c6;个人主页&#xff1a;CILMY23-CSDN博客 &#x1f3c6;系列专栏&#xff1a;Python | C | C语言 | 数据结构与算法 | 贪心算法 | Linux | 算…

ProxmoxPVE虚拟化平台--U盘挂载、硬盘直通

界面说明 ### 网络设置 ISO镜像文件 虚拟机中使用到的磁盘 挂载USB设备 这个操作比较简单&#xff0c;不涉及命令 选中需要到的虚拟机&#xff0c;然后选择&#xff1a; 添加->USB设置选择使用USB端口&#xff1a;选择对应的U盘即可 硬盘直通 通常情况下我们需要将原有…

【Linux 16】进程间通信的方式 - 共享内存

文章目录 &#x1f308; 一、共享内存概述⭐ 1. 什么是共享内存⭐ 2. 如何实现共享内存⭐ 3. 操作系统允许存在多个共享内存⭐ 4. 操作系统如何管理共享内存⭐ 5. 获取共享内存的唯一标识符 key⭐ 6. 为什么要由用户提供 key &#x1f308; 二、查看共享内存⭐ 1. 使用 ipcs -m…

TCP 协议的 time_wait 超时时间

优质博文&#xff1a;IT-BLOG-CN 灵感来源 Time_Wait 产生的时机 TCP四次挥手的流程 如上所知&#xff1a;客户端在收到服务端第三次FIN挥手后&#xff0c;就会进入TIME_WAIT状态&#xff0c;开启时长为2MSL的定时器。 【1】MSL是Maximum Segment Lifetime报文最大生存时间…

root 用户和权限

目录 1. 超级管理员 root 2. 切换用户 Switch User 2.1 普通用户切换到 root 用户 2.2 root 用户切换到普通用户 3. sudo 命令 3.1 配置认证 无论是 Windows&#xff0c;MacOS&#xff0c;Linux 均采用多用户的管理模式管理权限&#xff1b; 1. 超级管理员 root 在 Li…

2年社招冲击字节,一天三面斩获offer

在工作满两年的时间选择了求变&#xff0c;带着运气和实力以社招身份重新看今天的互联网环境&#xff0c;从结果看还是复合预期的。 整个面试的流程还挺快的。周中让招聘专员给投递了简历。问什么时候面试&#xff0c;申请了一个周日&#xff0c;直接安排三面。下周周中就开启…

C#中的wpf基础

在WPF中&#xff0c;Grid 是一种非常强大的布局控件&#xff0c;用于创建网格布局。它允许你将界面划分为行和列&#xff0c;并将控件放置在这些行和列中。 以下是一些关键点和示例&#xff0c;帮助你理解 WPF 中的 Grid&#xff1a; 基本属性 RowDefinitions&#xff1a;定义…

[MIT6.5840]MapReduce

MapReduce Lab 地址 https://pdos.csail.mit.edu/6.824/labs/lab-mr.html 论文地址 https://static.googleusercontent.com/media/research.google.com/zh-CN//archive/mapreduce-osdi04.pdf 工作原理 简单来讲&#xff0c;MapReduce是一种分布式框架&#xff0c;可以用来处理…

windows 安装docker桌面版

下载 下载两个&#xff1a; git桌面版 docker desktop 启动docker 执行安装文件&#xff0c;启动 更新wsl2 假如报错&#xff0c;会提示失败原因。 win10会提示跳转到&#xff1a; https://learn.microsoft.com/zh-cn/windows/wsl/install-manual#step-4—download-the-l…

从0到1,AI我来了- (4)AI图片识别的理论知识-II

上篇文章&#xff0c;我们理解了我们程序的神经网络设计&#xff0c;这篇我们继续&#xff0c;把训练迭代过程分析一下&#xff0c;完成这两篇文章&#xff0c;下面问题&#xff0c;应该能回答了。 一张图片&#xff0c;如何被计算机读懂&#xff1f;pytorch 封装的网络&#…

DP 整数拆分不同的二叉搜索树 DAY21

整数拆分&#xff1f; 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积。 示例 1: 输入: n 2 输出: 1 解释: 2 1 1, 1 1 1。示例 2: 输入: n 10 输…

全国区块链职业技能大赛样题第9套前端源码

后端源码地址:https://blog.csdn.net/Qhx20040819/article/details/140746050 前端源码地址:https://blog.csdn.net/Qhx20040819/article/details/140746216 智能合约+数据库表设计:https://blog.csdn.net/Qhx20040819/article/details/140746646 登录 ​ 用户管理