并发策略之分工原则

2023-11-11

本文主要思想来自 Java虚拟机并发编程 (薛笛 译)

为什么要用并发

并发是再在有限的资源下提高性能的有效手段。

当然现在互联网环境下并发访问的现象也比比皆是。

但是本文并不涉及处理并发访问,而是使用并发手段解决复杂任务的策略。

另外关于并发和并行的区别,以及一些基础的线程知识可以参见我之前的博客。

操作系统中进程和线程的概念理解

JAVA多线程基础实验编码及学习笔记总结

并发策略的意义

并发并不能保证程序效率的提高,相反可能会出现死锁,幻读,脏读等情

况。而采用什么样的并发策略是提高程序性能的关键。

程序的两大分类

IO密集型程序

顾名思义,这类程序的处理IO操作的时间较长。

而处理IO的情况下,程序会阻塞,等待 IO的结果。

这种情况下我们将程序挂起,执行其他的程序是符合我们性能优化的目标的。

eg. 从第三方API读取天气信息。程序要做的大量工作就是从远程将天气信息读取出来。

计算密集型程序

这类程序的主要工作是进行大量的运算。

这类程序和IO密集型的主要区别就在于划分成子任务的情况下,每个任务都可以是就绪状态,并且可以竞争CPU。

eg.某研究所的实验数据统计

分工原则

理解了上述的两种程序,就是本文的主要内容了,当然在这之前你要对操作系统中的线程,以及CPU的核心有足够清楚的认识

确定线程数

我们进行任务分工的时候首先要考虑的是创建多少个线程来进行我们的任务合适

当创建的线程数少于我们的CPU核心数时,我们的程序只会使用CPU的部分性能。这显然不是我们想要的

所以第一条原则

程序创建的线程数不应少于CPU的核心数

其次当应用程序属于IO密集型程序时,当一个任务执行IO操作时,其线程会被阻塞,所以CPU处理器可以立即进行上下文切换。转而处理其他任务。

而但应用程序属于计算密集型是,创建更多的线程反而会导致,多个线程处于就绪状态去竞争CPU处理器。会产生频繁的上下文切换,造成不必要的损失。

所以为了更好的确定程序应该创建的线程数量。我们需要知道两个参数 处理器可用核心数任务的阻塞系数

可用核心数可以用一些性能分析工具确定。

主要的就是任务的阻塞系数,将计算密集型任务的阻塞系数设为0,而IO密集型的设为1。我们就可以得到第二条原则

线程数=CPU可用核心数*(1-阻塞系数)

确定任务数

将复杂的任务分解,并分配给之前确定好的线程去执行。为了减少执行时间, 我们的理想状态是,所有线程的任务量一样重,能够同时结束时最好的了。

任务量其实就是任务的复杂程度。有时候将任务分解为相等的子任务并平均分配到各个线程上要花费的心思很多。

于是我们将任务进行尽可能的拆分尽力产生足够多的工作来使处理器一直不停的工作更有效。

这便是分工的第三条原则。

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

并发策略之分工原则 的相关文章

  • JAVA - 带有特殊字符的 LDAP 密码不起作用

    我试图在我的系统上创建一个登录屏幕 在 Active Directory 中进行查询 但是当用户的密码包含一些特殊字符 如 和 时 它不会验证 我需要加密密码才能工作吗 我该怎么做 我使用 getPassword 通过 JPasswordF
  • 如何自定义BlockingQueue的阻塞行为

    我想创建一个阻塞队列 它根据自定义规则而不是队列中的项目数量来阻止生产者 例如 生产者生成一些文件并放入队列中 消费者经过一番分析后将它们转移到特定位置 对于上述场景 如果队列中的总文件大小达到某个阈值 我希望生产者等待生成新文件 如果总大
  • 从 OMElement 对象获取 InputStream/io.Reader

    我有一个OMElement对象 从中我想得到一个InputStream或读者对象 我想要的是流式传输xml来自OMElement我有 没有加载到内存中 我只能得到XMLStreamReader对此表示反对 但我找不到办法得到InputStr
  • 以编程方式将 PEM 证书导入 Java KeyStore

    我有一个由两个文件 crt 和 key 组成的客户端证书 我希望将其导入到 java KeyStore 中 然后在 SSLContext 中使用 以通过 Apache 的 HTTPClient 发送 HTTP 请求 但是 我似乎找不到一种以
  • Java/JAXB:将具有相同名称但不同属性值的 XML 元素解组到不同的类成员

    我正在尝试根据其属性之一将具有多个 Fields 元素的 XML 解析为不同的类成员 这是 XML
  • java“void”和“非void”构造函数

    我用 java 编写了这个简单的类 只是为了测试它的一些功能 public class class1 public static Integer value 0 public class1 da public int da class1 v
  • Java:检查给定日期是否在当前月份内

    我需要检查给定的日期是否在当前月份 我编写了以下代码 但 IDE 提醒我getMonth https docs oracle com javase 7 docs api java util Date html getMonth and ge
  • 如何在具有动态列的表中插入值 Jdbc/Mysql

    我想在具有动态列的表中添加值 我设法创建一个包含动态列的表 但我不知道如何插入数据 Create Table sql CREATE TABLE MyDB myTable level INTEGER 255 int columnNumber
  • 无法从后台服务通过 WiFi 访问互联网

    我将直接介绍我发现的一些事实 数据 如果您遇到 解决了类似的问题 请帮助我 我每 5 分钟向服务器发送一次数据 除非用户在服务器的帮助下手动将其关闭 wakeful broadcast receiver通过一个intent service
  • Maven 多模块项目结构问题

    自从过去几周构建我的 Maven 多模块项目以来 这是我的一次有趣的经历 当我决定使用 Maven 进行构建生命周期管理时 我有几个原因希望选择 Maven A 大多数开发团队都是分开的 这样每个团队都可以在项目中的单独模块上工作 例如团队
  • Java G1 GC 处理引用对象运行缓慢

    我已经在 J ava 上运行了计数器 它24小时工作 每秒点击通过100次左右 白天 GC 处理时间从 20 60 毫秒缓慢上升到 10000 60000 毫秒 然后下降到 20 60 毫秒 这种模式不时地重复 从 GC 日志中我发现 GC
  • Java String.format 向整数添加空格

    我有一小段代码 我不明白输出 此输出向我的字符串格式文本添加空格 我做错了什么吗 public class HelloWorld public static void main String args int a1 540 int a2 4
  • .class 与 .java

    class 文件和 java 文件有什么区别 我正在尝试让我的小程序工作 但目前我只能在 Eclipse 中运行它 还不能嵌入 HTML 谢谢 编辑 那么如何使用 JVM 进行编译呢 class 文件是编译后的 java 文件 java 都
  • Java中的DRY原则[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我一直在读关于DRY https en wikipedia org wiki Don 27t repeat yourself原则 虽然看起来
  • 嵌入式 tomcat 7 servlet 3.0 注释不起作用

    我有一个精简的测试项目 其中包含 Servlet 版本 3 0 用注释声明 如下所示 WebServlet test public class TestServlet extends HttpServlet private static f
  • 如何计算文件中单词的长度?爪哇

    我正在尝试编写一个代码来计算文件中特定长度的单词数 例如 How are you 会打印 Proportion of 3 letter words 100 3 words 我想计算长度为 1 2 3 4 5 6 7 8 9 10 11 12
  • 为什么在尝试使用 Java 连接到 RDS PostgreSQL 数据库时会收到 SocketTimeoutException?

    我有一个 Spring 应用程序 我试图在 AWS 上托管 几天来我一直在努力配置 我有一个 EC2 实例 并且能够通过 SSH 连接到它 我还在 AWS 中设置了 Postgres RDS 数据库 但我无法使用 IDE 中的代码连接到它
  • 监控 Java 应用程序上的锁争用

    我正在尝试创建一个小基准 在 Groovy 中 以显示几个同步方法上的高线程争用 当监控自愿上下文切换时 应该会出现高争用 在 Linux 中 这可以通过 pidstat 来实现 程序如下 class Res private int n s
  • 日期时间解析异常

    解析日期时 我的代码中不断出现异常错误 日期看起来像这样 Wed May 21 00 00 00 EDT 2008 这是尝试读取它的代码 DateTimeFormatter formatter DateTimeFormatter ofPat
  • 如何使用 Spring AOP 建议静态方法?

    在执行类的静态方法之前和之后需要完成一些日志记录 我尝试使用 Spring AOP 来实现这一点 但它不起作用 而对于正常方法来说它起作用 请帮助我理解如何实现这一点 如果可以使用注释来完成 那就太好了 也许您应该在使用 Spring AO

随机推荐

  • 【RDMA】最全RDMA学习教程(建议收藏)

    目录 RDMA技术分享 RDMA技术分享 RDMA技术详解 RDMA编程 RDMA 网络 ROCE iWarp 性能优化 配置和特性优化 Qos流控 命令和测试 文档和相关资料 作者 bandaoyu 随时更新 源文连接 https blo
  • 图片上传的ajax代码,一个伪ajax图片上传代码实现示例

    if FILES gt window parent ajaxUploadPicture uploadCallback http img0 bdstatic com img image 5099213b07eca8065380ce7f75e9
  • tensorflow官方教程:运用模型对类别进行预测

    tensorflow官方教程 运用模型对类别进行预测 本文主要包含如下内容 tensorflow官方教程运用模型对类别进行预测 python版本 C代码 本教程将会教你如何使用Inception v3 你将学会如何用Python或者C 把图
  • ubuntu 安装Fastdfs

    安装fastdfs依赖插件libfastcommon 下载 https github com happyfish100 libfastcommon archive V1 0 39 tar gz 创建 usr local software 目
  • 蓝桥杯 BEGIN-2 long long int的使用

    include
  • 机房环境监控系统的作用,环境与设备监控系统的作用

    通信机房环境监控系统 以下简称动环监控系统 是指电源柜 UPS 监控 远程通信 远程调试 远程控制 即时监控其运行参数 故障检测和处理 记录和分析的有关数据 对其设备 空调 电池等工业设备以及门磁 红外 渗水 温湿度 烟度等环境参数进行统一
  • 别只盯着“四小龙”,CV的市场格局正在悄悄改变

    大数据产业创新服务媒体 聚焦数据 改变商业 在计算机视觉领域 比较知名的是商汤 旷视 云从 依图这 四小龙 他们不仅知名度更高 收入水平和估值也更高 从最新的财报来看 这四小龙都不同程度陷入了困境 收入增长乏力 巨额亏损看不到扭转的态势 四
  • crc16 ccitt的详细标准及其出处

    CRC16 CCITT是一个16位的循环冗余校验 CRC 算法 它是由国际电报电话咨询委员会 CCITT 制定的 该算法被广泛用于通信领域 以验证数据传输的完整性 以下是CRC16 CCITT算法的详细标准 多项式生成器 Polynomia
  • weblogic wls-wsat组件远程命令执行(CVE-2017-3506)

    所有文章 仅供安全研究与学习之用 后果自负 weblogic wls wsat组件远程命令执行 CVE 2017 3506 前言 与weblogic 反序列化 CVE 2017 10271 类似 一般情况下weblogic会开放7001以及
  • (port is already in use)端口被占用问题

    前言 端口占用问题几乎每个开发人员都会遇到 每次用每次查 下面来记录下解决过程 以便日后需要 正文 1 调出命令窗口 windows R 组合键 调出命令窗口 2 查找占用端口对应的PID 进程号 说明 以下举例用到的端口和进程等仅做参考
  • Cadence Allegro PCB快捷键设置

    1 通过env文件设置快捷键 在安装路径下D Cadence SPB 16 6 share pcb text中找到env文件 利用记事本打开 就可以加入自己的快捷键方式了 二 env文件在哪里 以我的电脑为例 在安装路径下D cadence
  • 实现点击图片放大查看功能

    1 html 代码 div style display none text align center width 100 height 100 background color none img style height 1 width 4
  • unity物体自身轴旋转_unity3d如何实现物体自动旋转-unity3d物体自动旋转的设置教程 - 河东软件园...

    unity3d是我们设计师用来制作游戏画面的软件 很多的手机App也可以使用它来制作 有的时候我们在游戏中能够看见一些人物或是物体的移动效果 例如平移 旋转等等都可以轻松的利用这款软件来实现 今天小编想和大家分享一下如何在unity3d中使
  • 2020-08-13

    https www cnblogs com daizhengyang p 13384169 html https blog csdn net qq 27289001 article details 77150598 https www cn
  • oracle学习之rownum和rowid

    rownum先百度一波https www cnblogs com xfeiyun p 16355165 html rownum是oracle特有的一个关键字 对于基表 在insert记录时 oracle就按照insert的顺序 将rownu
  • 编程的未来

    从 ChatGPT 诞生至今 在程序员的圈子里 我们一直有两种讨论 最开始所恐慌的 编程没有未来 ChatGPT 是不是要取代程序员 编程的方式前所未有地发生了变化 现如今 GitHub Copilot Chat 可以让开发者们直接在编辑器
  • 使用python分析数据分布

    要使用 Python 分析数据分布 你可以使用 Python 中的数据可视化库 如 matplotlib 或 seaborn 例如 你可以使用 matplotlib 的 hist 函数绘制数据的直方图 以查看数据的分布情况 你也可以使用 s
  • redis-cli报错Could not connect to Redis at 127.0.0.1:6379: Connection refused

    新手安装完redis后想要使用redis cli连接但是报错 为什么会报这个错呢 首先启动redis server 看能否启动 启动命令式 redis server 然后 1如果修改了IP地址 比如说改成了192 168 66 66 那么执
  • 中移物联ML302 4G Cat1 模组TCP/UDP 实现流程

    中移物联ML302 4G Cat1 模组TCP UDP 实现流程 注意 下文种的 表示 r n 一 首先AT 00 57 34 794 发 AT 00 57 35 756 发 AT 00 57 35 760 收 AT OK 二 查询卡CIM
  • 并发策略之分工原则

    本文主要思想来自 Java虚拟机并发编程 薛笛 译 为什么要用并发 并发是再在有限的资源下提高性能的有效手段 当然现在互联网环境下并发访问的现象也比比皆是 但是本文并不涉及处理并发访问 而是使用并发手段解决复杂任务的策略 另外关于并发和并行