Java并发编程学习1-并发简介

2023-11-18

Java并发编程学习系列

在这里插入图片描述

简介

在早期的计算机中不包含操作系统,它们从头到尾只执行一个程序,并且这个程序能访问计算机中的所有资源。在这种裸机环境中,不仅很难编写和运行程序,而且每次只能运行一个程序,这对于昂贵并稀有的计算机资源来说也是一种浪费。

操作系统的出现使得计算机每次能运行多个程序,并且不同的程序都在单独的进程中运行:操作系统为各个独立执行的进程分配各种资源,包括内存,文件句柄以及安全证书等。如果需要的话,在不同的进程之间可以通过一些粗粒度的通信机制来交换数据,包括:套接字、信号处理器、共享内存、信号量以及文件等。

上世纪60年代,在操作系统中一直都是以进程作为能独立运行的基本单位。然而随着计算机技术的发展,进程慢慢出现了很多弊端,一是由于进程是资源拥有者,创建、撤消与切换存在较大的时空开销;二是由于对称多处理机(SMP)出现,可以满足多个运行单位,而多个进程并行开销过大。为了最大程度提高系统运行的性能,人们在80年代又提出了比进程更小的能独立运行的基本单位 — 线程

如果说,在操作系统中引入进程的目的,是为了使多个程序并发执行,以改善资源利用率及提高系统的吞吐量;那么,在操作系统中再引入线程则是为了减少程序并发执行时所付出的时空开销,使操作系统具有更好的并发性。

线程是Java语言中不可或缺的重要功能,它们能使复杂的异步代码变得更简单,从而极大地简化复杂系统的开发;线程会共享进程范围内的资源,例如内存句柄和文件句柄,但每个线程都有各自的程序计数器、栈以及局部变量等。线程还提供了一种直观的分解模式来充分利用多处理器系统中的硬件并行性,而在同一个程序中的多个线程也可以被同时调度到多个CPU上运行。

在这里插入图片描述

线程的优势

如果使用得当,线程可以有效地降低程序的开发和维护等成本,同时提升复杂应用程序的性能。线程能够将大部分的异步工作流转换成串行工作流,因此能更好地模拟人类的工作方式和交互方式。此外,线程还可以减低代码的复杂度,使代码更容易编写、阅读和维护。

发挥多处理器的强大能力

多线程程序可以同时在多个处理器上执行。如果设计正确,多线程程序可以通过提高处理器资源的利用率来提高系统吞吐率。在多线程程序中,如果一个线程在等待I/O操作完成,另一个线程可以继续运行,使程序能够在I/O阻塞期间继续运行。

建模的简单性

通过使用线程,可以将复杂并且异步的工作流进一步分解为一组简单并且同步的工作流,每个工作流在一个单独的线程中运行,并在特定的同步位置进行交互。

异步事件的简化处理

服务器应用程序在接受来自多个远程客户端的套接字连接请求时,如果为每个连接都分配其各自的线程并且使用同步I/O,那么就会降低这类程序的开发难度。如果每个请求都拥有自己的处理线程,那么在处理某个请求时发生的阻塞将不会影响其他请求的处理。

响应更灵敏的用户界面

传统的GUI应用程序通常都是单线程的,在代码的各个位置都需要调用poll方法来获得输入事件或者通过一个“主事件循环(Main Event Loop)”来间接地执行应用程序的所有代码。如果在主事件循环中调用的代码需要很长时间才能执行完成,那么用户界面就会“冻结”,只有当执行控制权返回到主事件循环后,才能处理后续的用户界面事件。如果将长时间运行的任务放在一个单独的线程中运行,事件线程就能及时地处理界面事件,从而使用户界面具有更高的灵敏度。在现代的GUI框架中,例如 AWT 和 Swing 等工具,都采用一个事件分发线程(Event Dispatch Thread,EDT)来替代主事件循环。

线程的风险

安全性问题

线程安全性可能是非常复杂的,在没有充足同步的情况下,多个线程中的操作执行顺序是不可预测的,甚至会产生奇怪的结果。由于多个线程要共享相同的内存地址空间,并且是并发执行,因此它们可能会访问或修改其他线程正在使用的变量。当多个线程同时访问和修改相同的变量时,将会在串行编程模型中引入非串行因素,而这种非串行性是很难分析的。要使多线程程序的行为可以预测,必须对共享变量的访问操作进行协同,这样才不会在线程之间发生彼此干扰。

活跃性问题

安全性的含义是“永远不发生糟糕的事情”,而活跃性则关注于“某件正确的事情最终会发生”。当某个操作无法继续执行下去时,就会发生活跃性问题。后续的笔记中会慢慢介绍各种形式的活跃性问题,以及如何避免这些问题,包括死锁,饥饿,以及活锁。

性能问题

与活跃性问题密切相关的是性能问题。性能问题包括多个方面,例如服务时间过长,响应不灵敏,吞吐率过低,资源消耗过高,或者可伸缩性较低等。

结语

Java并发编程的学习注定是个枯燥的过程,为了结合实战学习并发编程,笔者推荐目前正在学习的这本《Java并发编程实战》。笔者整理这一系列的初衷是打算能够通过写博的方式,巩固当前所学的并发编程知识,如果在这个过程中能够帮助到正在学习并发编程的小伙伴,那也算是一件值得开心的事情。相信有交流、有总结的学习过程,就不会那么的枯燥无聊了。那么下一篇我们开始了解线程安全性的相关基础知识。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java并发编程学习1-并发简介 的相关文章

  • MMSegmentation笔记07:使用MMDeploy部署

    1 安装MMDeploy 首先要安装MMDeploy库 直接在对应环境下执行命令 pip install mmdeploy 1 2 0 然后在对应项目下安装MMDeploy源码 在cmd中执行 git clone https github

随机推荐

  • 求建议:二本计算机专业,考研还是就业做开发?

    安老师好 我是一个大连某二本院校的在读生 专业是计算机 日语强化 上大学以来一直关注着您的公众号 读了很多您的文章 学到很多东西 也受到过您的鼓舞 随您一同成长进步 目前我已是大三下 站在第二个人生岔路口 正为各种浮在空中的想法烦恼不已 身
  • C++ 读取文件和写入文件

    C 读取文件 有两种方式可以实现读文件的功能 第一种 用fread实现 这种方法适合读取各种结构化的数据包 include
  • 良心推荐:12个免费学习网站,赶紧收藏

    01 Oeasy http oeasy org Oeasy 是一个完全免费的综合视频教程网站 非常良心实用 它提供的视频教程非常丰富并且质量很高 包括 PS 教程 手机摄影教程 Ai 做图教程 Excel 教程 Word 教程 PPT 教程
  • python 安装第三方库,超时报错--Read timed out.(安装numpy时会出现)

    近期在安装numpy时 总是会出现Read timed out这个错误 经查是由于python在安装三方库时设置的时间限制 一般我们使用的命令为 pip install XXXX XXXX为你即将要安装的三方库 此时可能会出现以下错误 Re
  • 解决OpenCV重装后Python下import cv2错误问题(Ubuntu系统)

    本文是博主解决问题过程中所产生的一些想法 分享出来 希望能帮到一些朋友 不足之处 还望各位大佬不吝赐教 前提 博主在Ubuntu服务器上安装了OpenCV4 0版本 Python环境下可以运行 如图1 某天在部署YOLO3的时候 程序跳出e
  • git 错误error: failed to push some refs to

    今天使用VSCODE 学习node js 想在git上push代码 于是在git上建立了一个私有的长裤 连接后push代码时提示如下错误 error failed to push some refs to git github com Up
  • 树型权限管理插件:jQuery Tree Multiselect详细使用指南

    树型权限管理插件 jQuery Tree Multiselect详细使用指南 1 认识jQuery Tree Multiselect 这个插件允许用户以树型的形式来呈现列表复选框的选择 多用于权限管理中用于分配不同的权限 使用文档 请参考
  • unity2D横版游戏教程-1 让人物动起来

    在看完了麦扣老师的小狐狸的视频后 为了巩固练习 我另外找一个素材包来练手 顺便写成一个教程让自己更加熟练 同时当自己遗忘时可以回头查阅 另外 这个教程我写的非常详细 萌新也可以学习 有什么不对的地方或者有疑问的地方 欢迎指正和咨询 首先导入
  • python可视化——matplotlib画图颜色控制

    这里cd整理了python中matplotlib库中color可用的颜色 之前有人整理的是图片版 实际用的时候不怎么方便 因策这里整理了表格 颜色可以选择 方便使用 关于matplotlib中颜色的使用 有很多方式 1 用RGB或者RGBA
  • 给 MSYS2 添加中科大的源

    最近一段时间不知怎么的 使用默认的 MSYS2 源升级软件或是安装新软件的特别的慢 所以就翻了翻国内的几个开源软件的镜像库 发现中科大的库里就有 MSYS2 所以就研究了一下 给 MSYS2 添加了中科大的源 简单的说 msys64 etc
  • 领域驱动设计:DDD重构中台业务模型

    文章目录 如何避免重复造轮子 如何构建中台业务模型 如何避免重复造轮子 要避免重复建设 就要理解中台的理念和思想 中台是企业级能力复用平台 复用 用白话说就是重复使用 就是要避免重复造轮子的事情 中台的设计思想与 高内聚 低耦合 的设计原则
  • Oracle入门笔记(四)——Oracle表约束和表间关系

    Oracle表约束和表间关系 1 Oracle数据表要求 2 Oracle数据表约束 3表间关系 3 1一对一关系 3 1一对多关系 3 1多对多关系 1 Oracle数据表要求 1 必须以字母开头 2 长度不能超过30字符 3 避免使用关
  • 软件测试项目管理系统(STM)

    1 产品介绍 凯云软件测试项目管理系统 Software Testing Management System 简称 STM 是为企业软件测试部门以及第三方软件测试机构打造的统一工作平台 该系统提供规范的测试流程 支持被测件接收 测试需求分析
  • 若依RuoYi-Vue代码学习一---若依如何基于OncePerRequestFilter【Spring Security的过滤器】验证的token与用户信息

    文章目录 一 通过token获取用户信息 二 验证token过期 一 通过token获取用户信息 代码位置 com ruoyi framework security filter JwtAuthenticationTokenFilter 直
  • https://isux.tencent.com/svg-animate.html(svg动画)

    初学SVG的时候 感觉那一坨一坨的代码难读难懂 现在回过头仔细想想 是因为那时候看文档缺少一些具体的实例 导致学习起来很枯燥 如今SVG已经在前端各个领域都有所作为 无论是项目里的应用还是demo都所处可见 这里我就用一个实例的写法带新同学
  • Android 上传头像功能第三方框架Boxing与TakePhoto使用总结

    刚做了个人中心的上传头像功能 就来总结一下做的过程 一开始就直接去github上找一个第三方框架接入 省点事 先是听了朋友的推荐去看了一下bilibili开源的一款Boxing的框架 但是使用起来发现不太符合我的需求 最后还是使用TakeP
  • 【学习排序】 Learning to Rank 中Listwise关于ListNet算法讲解及实现

    前一篇文章 Learning to Rank中Pointwise关于PRank算法源码实现 讲述了基于点的学习排序PRank算法的实现 该篇文章主要讲述Listwise Approach和基于神经网络的ListNet算法及Java实现 包括
  • inno setup打包软件学习

    目录 一 打包结果 二 示例打包脚本 三 错误解决 3 1 另一个程序正在使用此文件 进程无法访问 3 2 桌面图标无法修改 四 参考资料 一 打包结果 测试程序来自 泽森科工 zenustech com 二 示例打包脚本 使用打包软件下载
  • SVN服务器权限设置

    1 authz文件内容 groups admin xiaoming team1 zhangsan admin rw admin具有svnRepos根目录下所有文件的读写权限 组别为team1的人员具有projectname目录下所有文件的读
  • Java并发编程学习1-并发简介

    Java并发编程学习系列 Java并发编程学习 简介 线程的优势 发挥多处理器的强大能力 建模的简单性 异步事件的简化处理 响应更灵敏的用户界面 线程的风险 安全性问题 活跃性问题 性能问题 结语 简介 在早期的计算机中不包含操作系统 它们