【并发编程】并发并行,同步异步,线程安全,线程的几种状态并发三要素?创建线程的方法?线程间的通信方式?进程的通信方式?多线程的上下文切换?CAS 算法

news2024/11/15 6:40:38

目录

并发并行,同步异步,线程安全

线程的几种状态

并发三要素?

创建线程的方法?

线程间的通信方式?

进程的通信方式?

多线程的上下文切换?

CAS 算法


并发并行,同步异步,线程安全

  • 同步:发出一个调用之后,在没有得到结果之前, 该调用就不可以返回,一直等待。

  • 异步:调用在发出之后,不用等待返回结果,该调用直接返回。

  • 并发:两个及两个以上的作业在同一 时间段 内执行。

  • 并行:两个及两个以上的作业在同一 时刻 执行。

  • 线程安全指的是在多线程环境下,对于同一份数据,不管有多少个线程同时访问,都能保证这份数据的正确性和一致性。

  • 线程不安全则表示在多线程环境下,对于同一份数据,多个线程同时访问时可能会导致数据混乱、错误或者丢失。

线程的几种状态

 

并发三要素?

  • 原子性:一个或者多个操作要么全部执行成功要么全部执行失败。

  • 有序性:程序执行顺序按照代码顺序先后执行,但是CPU可能会对指令进行重排序。

  • 可见性:当多个线程访问同一个变量时,如果一个线程修改了变量,其他线程立即获取最新的值。

创建线程的方法?

  1. 继承Thread类

  2. 实现Runnable接口

  3. 实现Callable接口( JDK1.5>= )

  4. 线程池方式创建

Callable接口类似于Runnable接口,但是它可以返回一个结果,并且可以抛出异常。

继承Thread类的优缺点

优点:编写简单,如果需要访问当前线程,无需使用 Thread.currentThread() 方法,直接使用this即可获取当前线程

缺点:因为线程类已经继承了Thread类,Java语言是单继承的,所以就不能再继承其他父类了。

实现Runnable、Callable接口的优缺点

优点:线程类只是实现了Runnable或者Callable接口,还可以继承其他类。这种方式下,多个线程可以共享一个target对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU、代码和数据分开,形成清晰的模型,较好的体现了面向对象的思想。

缺点:编程稍微复杂一些,如果需要访问当前线程,则必须使用 Thread.currentThread() 方法

线程间的通信方式?

  1. 共享内存: 多个线程可以通过访问共享的内存区域来进行通信。线程可以读取和写入共享内存中的数据,从而进行信息的交换和共享。为了保证线程之间的访问顺序和数据的一致性,需要使用同步机制(如锁、volatile关键字)来进行线程间的同步。

  2. 消息传递

    在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过明确的发送消息来显式进行通信。在 Java 中典型的消息传递方式,就是 wait() 和 notify() ,或者 BlockingQueue 。

    • wait()和notify() / notifyAll(): wait()和notify() / notifyAll()是Object类中定义的方法,用于线程之间的协调和通信。线程可以调用wait()方法进入等待状态,并释放占有的锁,等待其他线程调用notify() / notifyAll()方法唤醒自己。notify()方法会随机选择一个等待的线程进行唤醒,而notifyAll()方法会唤醒所有等待的线程。被唤醒的线程会重新竞争锁,并继续执行。

  • 阻塞队列(BlockingQueue): 阻塞队列是一种线程安全的队列,支持线程在队列为空或队列已满时进行阻塞等待或唤醒。一个线程可以将数据放入队列中,而另一个线程可以从队列中获取数据。阻塞队列提供了一种高效且线程安全的方式,用于线程之间的数据交换和通信。

进程的通信方式?

  1. 管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。

  2. 命名管道FIFO:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。

  3. 消息队列MessageQueue:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

  4. 共享存储SharedMemory:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。

  5. 信号量Semaphore:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

  6. 套接字Socket:套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。

  7. 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

多线程的上下文切换?

上下文切换是指操作系统在执行多个线程时,将当前线程的上下文(包括寄存器状态、程序计数器、栈指针等)保存起来,然后切换到另一个线程的上下文,使得另一个线程可以继续执行。

上下文切换是由操作系统内核完成的,它可以在不同线程之间实现公平的时间片轮转调度,以实现线程的并发执行。

上下文切换发生的情况有以下几种:

  1. 时间片耗尽:一个线程的时间片用完后,操作系统会将当前线程的上下文保存起来,并选择下一个要执行的线程进行切换。

  2. 高优先级线程抢占:当一个高优先级的线程抢占了当前正在执行的低优先级线程时,操作系统会进行上下文切换,以保证高优先级线程尽快执行。

  3. 阻塞操作:当一个线程执行了阻塞操作(如等待I/O、等待锁、等待信号量等)时,操作系统会将该线程的上下文保存起来,并切换到另一个可执行的线程。

一些减少上下文切换的方法:

  • 使用线程池:通过线程池管理线程的创建和复用,避免线程的频繁创建和销毁。

  • 减少阻塞操作:使用非阻塞的IO操作、使用无锁数据结构、避免长时间等待等,减少线程的阻塞时间,从而减少上下文切换的次数。

  • 合理设置线程优先级:合理设置线程的优先级,使得高优先级线程不会频繁地抢占低优先级线程,减少上下文切换的次数。

  • 使用协程或轻量级线程:协程或轻量级线程能够在不切换线程上下文的情况下实现任务的切换,从而减少上下文切换的开销。

CAS 算法

CAS 的全称是 Compare And Swap(比较与交换) ,用于实现乐观锁。CAS 的思想就是用一个预期值和要更新的变量值进行比较,两值相等才会进行更新。

CAS 是一个原子操作,底层依赖于一条 CPU 的原子指令。

原子操作 即最小不可拆分的操作,也就是说操作一旦开始,就不能被打断,直到操作完成。

CAS 涉及到三个操作数:

  • V:要更新的变量值(Var)

  • E:预期值(Expected)

  • N:拟写入的新值(New)

当且仅当 V 的值等于 E 时,CAS 通过原子方式用新值 N 来更新 V 的值。如果不等,说明已经有其它线程更新了 V,则当前线程放弃更新。

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

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

相关文章

CICD流水线(发布后端代码)!!!

1、新建流水线 2、添加流水线源 3、测试环节 4、构建上传 ①java构建上传 ②java镜像构建 5、部署 1、Docker部署 6、开启代码推送自动部署 ①开启自动部署 ②找到你代码提交的私有仓库 7、整体叙述 ①:新建流水线 ②:添加流水线源,选择代码…

python发艺美发店管理系统flask-django-php-nodejs

系统根据现有的管理模块进行开发和扩展,采用面向对象的开发的思想和结构化的开发方法对发艺美发店管理的现状进行系统调查。采用结构化的分析设计,该方法要求结合一定的图表,在模块化的基础上进行系统的开发工作。在设计中采用“自下而上”的…

(南京观海微电子)——LCD与OLED优缺点对比

屏幕区别 如何区分OLED屏幕和LCD屏幕? 我们可以通过简单的方式区分OLED屏幕和LCD屏幕,打开一部手机的相机,调整到专业模式,快门调到最高,然后对着点亮的屏幕观察,如果出现规则的条纹就是OELD屏幕&#xff…

基于多态的职工管理系统学习记录

职工管理系统 1、管理系统需求 公司中职工分为三类:普通员工、经理、老板,显示信息时,需要显示职工编号、职工姓名、职工岗位、以及职责 普通员工职责:完成经理交给的任务 经理职责:完成老板交给的任务&#xff0c…

人脸表情识别系统项目完整实现详解——(二)使用SSD模型检测人脸

摘要:人脸检测是人脸表情识别系统中至关重要的一环,其准确性直接影响到整个系统的性能表现。本文介绍了使用SSD模型和OpenCV进行高效人脸检测的完整代码实现。我们详细介绍了SSD人脸检测器的工作原理,包括如何加载预训练的SSD模型&#xff0c…

【C++】1311. 分跳绳

问题:1311. 分跳绳 类型:基本运算、整数运算 题目描述: 学校新买来 m 根跳绳,每个班分 n 根,最多可以分给几个班的同学,还剩多少根?(m≥n)。 输入: 两个整…

【python绘图colorbar对齐】

[Toc]# 1、问题描述 python在绘图过程中,可能会出现colorbar高度与主图不匹配情况,需要进行调整,使得与主图高度对齐,使图像更美观。示例:colorbar位置高于主图 2、解决方法 通过调整shrink参数匹配对齐,pad调整x轴…

2024 年 AI 辅助研发趋势将更加强调智能化、自动化和个性化

目录 前言 AI辅助研发的技术进展 行业应用案例 医药行业 汽车行业 电子行业 面临的挑战与机遇 技术挑战 伦理问题 数据安全 机遇和解决方案 未来趋势预测 1. 深度融合AI与研发流程 2. 智能研发平台的崛起 3. 强化AI与人类智慧的融合 前言 当谈到人工智能&#xff…

台达变频通过Modbus转Profinet网关可以在环网冗余中使用

Modbus转Profinet网关(如XD-MDPN100)是一种能够实现Modbus协议与Profinet协议之间转换的设备。它支持Modbus RTU协议和Profinet协议还支持MRP环网冗余系统,,可以通过配置软件进行协议转换,使得原本只能使用Modbus协议的设备可以与…

禁止区域入侵检测

1. 物体检测 Object detection with deep learning and OpenCV In the first part of today’s post on object detection using deep learning we’ll discuss Single Shot Detectors and MobileNets. When combined together these methods can be used for super fast, real…

马蹄集oj赛(双周赛第二十三次)

目录 数列分割 小码哥的地毯 小码哥的三色墙 palace 高数考试 新全排列 黑白双煞 等差 数三角形 区间修改 相对马高 小码哥剪绳子 数列分割 难度:黄金 时间限制:1秒巴 占用内存:64 M 小码哥给你一个长度为n的数列,求将该数列分割成两个左右两个部分且两…

【CVTE 一面凉经Ⅰ】循环依赖如何解决

目录 一.🦁 开始前的废话二. 🦁 什么是循环依赖?三. 🦁Spring 容器解决循环依赖的原理是什么?五. 🦁 三级缓存解决循环依赖的原理六. 🦁 由有参构造方法注入属性的循环依赖如何解决?七.&#x…

【算法分析与设计】相同的树

题目 给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。 示例 示例 1: 输入:p [1,2,3], q [1,2,3] 输出:true示…

IDEA创建Maven项目实现数据库表查询

在此之前,务必确保你本地环境已经正确配置了 JDK 和 Maven,并且相关的环境变量已经设置。这是你踏上编程之旅的第一步,也是你与代码交互的基础。可通过命令提示符中输入 java -version 和 mvn -v 命令,以验证你的 JDK 和 Maven 是…

多ip多进程代理的实现方法

目录 写在前面 一、背景 二、实现方法 1. 使用多线程处理代理请求 2. 使用多进程处理代理请求 3. 实现多IP代理 三、总结 写在前面 实现多IP多进程代理需要使用Python的多线程和多进程模块。本文将介绍如何使用这些模块来实现多IP多进程代理,并提供相关的代…

蓝桥杯练习——神秘咒语——axios

目标 完善 index.js 中的 TODO 部分,通过新增或者修改代码,完成以下目标: 点击钥匙 1 和钥匙 2 按钮时会通过 axios 发送请求,在发送请求时需要在请求头中添加 Authorization 字段携带 token,token 的值为 2b58f9a8-…

五.java数组

1.int [] arr{1,2,3} 2.lenarr.length; 3.数组内存执行原理 java程序编译后产生一个class文件然后提交到内存中的虚拟机JVM中去运行,java为了便于虚拟机运行程序就将虚拟机的这块内存划分为5个区域:方法区,栈,堆。。。 经典函数…

Matlab快捷键与函数

注释:注释对于代码的重要性我们就不做过多的解释了。不做注释的代码不是好代码。选中要注释的语句,按快捷键CtrlR,或者在命令行窗口上面的注释地方可以进行注释。当然也可以直接在语句前面“%”就可以(注意:一定要用英文符号&…

BigDecimal类的使用,用于精确计算任意精度的数字

BigDecimal类 BigDecimal 是 Java 中用于精确表示任意精度的十进制数的类。在很多情况下,使用基本数据类型(如 double 或 float)进行浮点数计算可能会导致精度丢失或舍入错误。BigDecimal 提供了一种更精确的解决方案,可以处理需要高精度计算的场景,比如财务应用或科学计算…

29-3 哥斯拉安装使用

环境准备:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客 一、哥斯拉 (Godzilla) 介绍 哥斯拉是一个基于流量、HTTP全加密的webshell管理工具,具有以下特点: 内置了3种Payload以及6种加密器,6种支持脚本后缀,20个内置插件基于Java,可…