Java并发编程简介

article/2025/9/16 23:49:08

并发编程简介

1. 什么是并发编程
所谓并发编程是指在一台处理器上“同时”处理多个任务。并发是在在同一实体上的多个事件。多个事件在同一时间间隔发生。
并发编程
①从程序设计的角度来讲,是希望通过某些机制让计算机可以在一个时间段内,执行多个任务。
②从计算机CPU硬件层面来说,是一个或多个物理CPU在多个程序之间多路复用,提高对计算机资源的利用率。
③从调度算法角度来说,当任务数量多于CPU的核数时,并发编程能够通过系统的任务调度算法,实现多个任务一起执行。
2.并发编程的重要性
它是Java语言中最为晦涩的知识点,它涉及操作系统、内存、CPU、编程语言等多方面的基础能力,在开发语言中占据着无可替代的位置。
3.并发编程的特性
1.原子性
2.可见性
3.有序性
4.并发编程的意义
开发者通过使用不同的语言,实现并发编程,充分的利用处理器(CPU)的每一个核,以达到最高的处理性能,提升服务器的资源利用率,提升数据的处理速度。
5.从CPU层面谈并发编程
首先我们看下图,图中展示了最简单的CPU核心通过缓存与主存进行同通信的模型。
在缓存出现后不久,系统变得越来越复杂,缓存与主存之间的速度差异被拉大,由于 CPU 的频率太快了,快到主存跟不上,这样在线程处理器时钟周期内,CPU 常常需要等待主存,这样就会浪费资源。从我们的感官上,计算机可以同时运行多个任务,但是从 CPU 硬件层面上来说,其实是 CPU 执行线程的切换,由于切换频率非常快,致使我们从感官上感觉计算机可以同时运行多个程序。为了避免长时间的线程等待,我们一方面提升硬件指标(如多级高速缓存的诞生,这里不做讨论),另一方面引入了并发概念,充分的利用处理器(CPU)的每一个核,减少 CPU 资源等待的时间,以达到最高的处理性能。
6.操作系统,进程, 线程之间的联系与区别
这三者之间的关系如图,操作系统是包含多个进程的容器,而每个进程又是容纳多个线程的容器。
在这里插入图片描述
什么是进程?
官方定义:
进程(baiProcess)是计算机中的程序关于某数据集合的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。

Tips:系统进行资源分配和调度的基本单位其实就是 CPU 时间片的切换,一个 CPU 同一时间只能操作一个任务,只不过 CPU 在不停的切换工作任务,这里的时间片就是我们所说的系统进行资源分配和调度的基本单位。

那么从定义上感觉非常的抽象,但是进程其实就在我们日常的计算机使用过程中。请看下图,进入任务管理器看 Windows 操作系统下的进程:
在这里插入图片描述
什么是线程?
官方定义:
线程是操作系统能够进行资源调度的最小单位,它被包含在进行之中,是进程中的实际运作单位,单个线程执行的都是进程代码的某个片段,特定的线程总是在执行特定的任务。

那么进程和线程有什么区别呢?

- 诞生起源:现有进程,后有线程。进程由于资源利用率、公平性和便利性诞生。处理器的速度往往比外设的速度快(键盘、鼠标),为了提高 CPU 的利用率,诞生了线程,目的就是为了提高程序的执行效率。
- 概念:进行是资源分配的最小单位。线程时程序执行的最小单位(线程是操作系统能够进行资源调度的最小单位,同个进程中的线程也可以被同时调度到多个 CPU 上运行),线程也被称作为轻量级进程。
- 内存共享:默认情况下,进程的内存无法与其他进程共享(进程间通信通过 IPC 进行)。线程共享由操作系统分配给其父进程的内存块。
7.串行,并行与并发
串行:顺序执行,按部就班。在A任务执行完之前不能执行B。
并行:同时执行,多管齐下。指两个或两个以上事件或活动在同一时刻发生。在多道程序环境下,并行性使多个程序同一时刻可在不同CPU核心上同时执行。
并发:穿插执行,减少等待。指多个线程轮流穿插着执行,并发的实质是一个物理CPU在若干道程序之间多路复用,其目的是提高有限物理资源的运行效率。
在这里插入图片描述
小结
本博客重点讲解了操作系统的并发原理,以及进程和线程之间的区别与联系。除此之外,理解串行,并行,并发三种线程执行方式的区别尤为重要,对以后的课程学习有很大的帮助。


http://chatgpt.dhexx.cn/article/6KWZeiSc.shtml

相关文章

【java】Java并发编程系列-基础知识(非常详细哦)

文章目录 一、Java并发编程基础1.1 并发编程基本概念1.1.1原⼦性1.1.2 可⻅性1.1.3 有序性 二、内存模型三、重排序四、内存屏障五、总结 一、Java并发编程基础 主要讲解Java的并发编程的基础知识,包括原⼦性、可⻅性、有序性,以及内存模型JMM&#xff…

理解Java并发编程

计算机基础 要想理解Java多线程,一定离不开计算机组成原理和操作系统,因为,java的多线程是JVM虚拟机调用操作系统的线程来实现的 /*Thread.start() 方法中调用了原生的start0()方法 */ public synchronized void start() {if (threadStatus…

【并发编程】JAVA并发编程面试题合集

1.在Java中守护线程和本地线程的区别? Java中的线程分为两种:守护线程(Daemon)和用户线程(User)任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDaemon(boolean);true表…

Java并发编程概述

在学习并发编程之前,我们需要稍微回顾以下线程相关知识: 线程基本概念 程序:静态的代码,存储在硬盘中 进程:运行中的程序,被加载在内存中,是操作系统分配内存的基本单位 线程:是cpu执…

java并发编程(并发编程的三个问题)

什么是并发编程? 首先我们要知道什么是并发? 什么是并行? 并行: 多件事情在同一时刻同时发生 并发: 在同一时间内,多个事情交替执行 并发编程: 比如抢票,秒杀等在同一场景下,有大量的请求访问同一资源, 会出现一些安全性的问题,所以要通过编程来控制多个线程依次访问资源,称…

java并发编程(荣耀典藏版)

大家好 我是月夜枫,聊一聊java中的并发编程,面试工作中也许都会用到,参考了很大博主的博客,整理了很久的文章,虽然还没有全部整理完,后续慢慢更新吧。 并发编程 一、线程的基础概念 一、基础概念 1.1 进…

Java并发编程基础(一篇入门)

1 并发编程简介 1.1 什么是并发编程 所谓并发编程是指在一台处理器上 “同时” 处理多个任务。并发是在同一实体上的多个事件。多个事件在同一时间间隔发生。 并发编程,从程序设计的角度来说,是希望通过某些机制让计算机可以在一个时间段内&#xff0…

关于Java并发编程的总结和思考

编写优质的并发代码是一件难度极高的事情。Java语言从第一版本开始内置了对多线程的支持,这一点在当年是非常了不起的,但是当我们对并发编程有了更深刻的认识和更多的实践后,实现并发编程就有了更多的方案和更好的选择。本文是对并发编程的一…

Java 并发编程

目录 回顾线程 并发编程 并发编程 Java 内存模型(JMM) 编程核心问题--可见性,原子性,有序性 可见性 有序性 原子性 valatile 关键字 CAS(Compare-And-Swap,比较并交换) 原子类 java中的锁 乐观锁/悲观锁 可重用锁(…

JAVA并发编程

并发编程 1.进程与线程 进程 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在 指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的。当一个…

阿里面试失败后,一气之下我图解了Java中18把锁

号外号外!《死磕 Java 并发编程》系列连载中,大家可以关注一波: 「死磕 Java 并发编程04」说说Java Atomic 原子类的实现原理 「死磕 Java 并发编程03」阿里二面,面试官:说说 Java CAS 原理? 「死磕 Jav…

Java 是否应该使用通配符导入( wildcard imports)

这个问题应该是所有使用过 Java 第一课的人都会告诉你不要使用通配符导入。 主要问题 主要的问题是它使你的本地命名空间变得混乱。 用最简单的说法就是 Date 这个对象,你可能在 java.sql.Date 和 java.util.Date 都会有这个对象。 如果你使用通配符导入的话&…

Makefile中wildcard函数的应用理解

文章目录 前言 1 "*"通配符使用场景 2 "*"通配符实例 总结 前言 如果我们想定义一系列比较类似的文件,我们很自然地就想起使用通配符。make 支持三种通配符:"*","?" 和 "[...]"。这…

DNS Wildcard(DNS泛域名)

在DNS中,泛域名(wildcard Resource Record)可以被认为是一种合成RR的机制,借助于它,DNS服务器可以响应本来不存在的域名的请求,它的设计初衷是用来把所有邮件都转发到一个邮件系统(当然&#xf…

Es 模糊查询 match,wildcard

Es 模糊查询的方式 要求: Es查询: 查询工单信息, 输入 “测试”,查出 form_name 为字段中有查询出含有符合内容的数据 match:分词模糊查询: 比如“Everything will be OK, All is well”,会被…

wildcard

[ruskyrhel7 test]$ lstest1 test123 test2 test317 test33 test335 test336 test44 testtest[ruskyrhel7 test]$ ls test?3test33[ruskyrhel7 test]$ ls test??3test123[ruskyrhel7 test]$ ls test*test1 test123 test2 test317 test33 test335 test336 tes…

Makefile中wildcard使用方法

Makefile中wildcard函数使用方法 在Makefile规则中,通配符会被自动展开。但在变量的定义和函数引用时,通配符将失效。这种情况下如果需要通配符有效,就需要使用函数“wildcard”,它的用法是:$(wildcard PATTERN…) 。…

通配符(WildCard)的使用

一、关于WildCard:一个web应用,有成千上万个action声明,可以利用struts2提供的映射机制把多个彼此相似的映射关系简化成一个映射关系,即通配符。 1.新建类 ActionWildCard,验证通配符的方法 2.1添加Student需要实践的两…

Elasticsearch 警惕使用 wildcard 检索!然后呢?

1、wildcard 检索定义 wildcard 检索可以定义为:支持通配符的模糊检索。 类似 Mysql 中的 like 模糊匹配,如下所示: Elasticsearch 中的 wildcard 使用方式如下: 通配符运算符是匹配一个或多个字符的占位符。 通配符支持两种&…

VIO你用对了吗

VIO(Virtual Input/Output)有两个主要功能 监测设计中的内部信号; 驱动设计中的内部信号。 既然是Virtual(虚拟的),就表明这个输入或输出并不是真实存在于FPGA设计中。下图显示了VIO的输入、输出管脚。其…