java编程分工_这3个并发编程的核心,你一定要知道!

2023-10-23 21:20

本文主要是介绍java编程分工_这3个并发编程的核心,你一定要知道!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

远看并发,并发编程可以抽象成三个核心问题: 分工、同步/协作、互斥

如果你已经工作了,那么你一定听说过或者正在应用敏捷开发模式来交付日常的工作任务,我们就用你熟悉的流程来解释这三个核心问题

51025a04f76dc042aafe1ba6ec81e8b1.png

分工将当前 Sprint 的 Story 拆分成「合适」大小的 Task,并且安排给「合适」的 Team Member 去完成

这里面用了两个「合适」,将 Story 拆分成大小适中,可完成的 Task 是非常重要的。拆分的粒度太粗,导致这个任务完成难度变高,耗时长,不易与其他人配合;拆分的粒度太细,又导致任务太多,不好管理与追踪,浪费精力和资源。(合适的线程才能更好的完成整块工作,当然一个线程可以轻松搞定的就没必要多线程);安排给合适的人员去完成同样重要,UX-UE 问题交给后端人员处理,很显然是有问题的 (主线程应该做的事交给子线程显然是解决不了问题的,每个线程做正确的事才能发挥作用)

关于分工,常见的 Executor,生产者-消费者模式,Fork/Join 等,这都是分工思想的体现

008a68ed84511576db0bc63ce6e2105d.png

同步/协作

任务拆分完毕,我要等张三的任务,张三要等李四的任务,也就是说任务之间存在依赖关系,前面的任务执行完毕,后面的任务才可以执行,人高级在可以通过沟通反复确认,确保自己的任务可以开始执行。但面对程序,我们需要了解程序的沟通方式,一个线程执行完任务,如何通知后续线程执行

所有的同步/协作关系我们都可以用你最熟悉的 If-then-else 来表示:if(前序任务完成){

execute();

}else{

wait();

}

上面的代码就是说:当某个条件不满足时,线程需要等待;当某个条件满足时,线程需要被唤醒执行,线程之间的协作可能是主线程与子线程的协作,可能是子线程与子线程的合作, Java SDK 中 CountDownLatch 和 CyclicBarrier 就是用来解决线程协作问题的

互斥

分工和同步强调的是性能,但是互斥是强调正确性,就是我们常常提到的「线程安全」,当多个线程同时访问一个共享变量/成员变量时,就可能发生不确定性,造成不确定性主要是有可见性、原子性、有序性这三大问题,而解决这些问题的核心就是互斥互斥同一时刻,只允许一个线程访问共享变量

来看下图,主干路就是共享变量,进入主干路一次只能有一辆车,这样你是否理解了呢?「天下大事,分久必合」

6bc4abcb9c89abb3390076727e774e89.gif

同样 Java SDK 也有很多互斥的解决方案,比如你马上就能想到 synchronized 关键字,Lock,ThreadLocal 等就是互斥的解决方案

总结

资本家疯狂榨取劳动工人的剩余价值,获得最大收益。当你面对 CPU,内存,IO 这些劳动工人时,你就是那个资本家,你要思考如何充分榨取它们的价值当一个工人能干的活,绝不让两个人来干(单线程能满足就没必要为了多线程)当多个工人干活时,就要让他们分工明确,合作顺畅,没矛盾

当任务很大时,由于 IO 干活慢,CPU 干活快,就没必要让 CPU 死等当前的 IO,转而去执行其他指令,这就是榨取剩余价值,如何最大限度的榨取其价值,这就涉及到后续的调优问题,比如多少线程合适等

分工是设计,同步和互斥是实现,没有好的设计也就没有好的实现,所以在分工阶段,强烈建议大家勾划草图,了解瓶颈所在,这样才会有更好的实现,后续章节的内容,我也会带领大家画草图,分析问题,逐步养成这个习惯

欢迎大家关注我的公种浩【程序员追风】,文章都会在里面更新,整理的资料也会放在里面。

本章内容可以用下面的图来简单概括,叶子结点的内容我们会逐步点亮,现阶段不用过分关注(如果你上来就啃 JDK 源码,也许你会痛苦的迷失,并最终放弃你的进阶之路的)

b4f2f9d5123d54c830ddf39f4f1725f6.png

理解三大核心问题,你要充分结合生活中的实际,程序中的并发问题,基本上都能在实际生活中找得到原型。

最后

欢迎大家一起交流,喜欢文章记得点个赞哟,感谢支持!

这篇关于java编程分工_这3个并发编程的核心,你一定要知道!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/270517

相关文章

java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

《java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)》:本文主要介绍java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三... 目录准备Pdf模版方法1:itextpdf7填充表单(1)加入依赖(2)代码(3)遇到的问题方法2:pd

Java Stream流之GroupBy的用法及应用场景

《JavaStream流之GroupBy的用法及应用场景》本教程将详细介绍如何在Java中使用Stream流的groupby方法,包括基本用法和一些常见的实际应用场景,感兴趣的朋友一起看看吧... 目录Java Stream流之GroupBy的用法1. 前言2. 基础概念什么是 GroupBy?Stream

SpringBoot监控API请求耗时的6中解决解决方案

《SpringBoot监控API请求耗时的6中解决解决方案》本文介绍SpringBoot中记录API请求耗时的6种方案,包括手动埋点、AOP切面、拦截器、Filter、事件监听、Micrometer+... 目录1. 简介2.实战案例2.1 手动记录2.2 自定义AOP记录2.3 拦截器技术2.4 使用Fi

最新Spring Security的基于内存用户认证方式

《最新SpringSecurity的基于内存用户认证方式》本文讲解SpringSecurity内存认证配置,适用于开发、测试等场景,通过代码创建用户及权限管理,支持密码加密,虽简单但不持久化,生产环... 目录1. 前言2. 因何选择内存认证?3. 基础配置实战❶ 创建Spring Security配置文件

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

springboot自定义注解RateLimiter限流注解技术文档详解

《springboot自定义注解RateLimiter限流注解技术文档详解》文章介绍了限流技术的概念、作用及实现方式,通过SpringAOP拦截方法、缓存存储计数器,结合注解、枚举、异常类等核心组件,... 目录什么是限流系统架构核心组件详解1. 限流注解 (@RateLimiter)2. 限流类型枚举 (

Java Thread中join方法使用举例详解

《JavaThread中join方法使用举例详解》JavaThread中join()方法主要是让调用改方法的thread完成run方法里面的东西后,在执行join()方法后面的代码,这篇文章主要介绍... 目录前言1.join()方法的定义和作用2.join()方法的三个重载版本3.join()方法的工作原

Spring AI使用tool Calling和MCP的示例详解

《SpringAI使用toolCalling和MCP的示例详解》SpringAI1.0.0.M6引入ToolCalling与MCP协议,提升AI与工具交互的扩展性与标准化,支持信息检索、行动执行等... 目录深入探索 Spring AI聊天接口示例Function CallingMCPSTDIOSSE结束语

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取

Spring Boot Actuator应用监控与管理的详细步骤

《SpringBootActuator应用监控与管理的详细步骤》SpringBootActuator是SpringBoot的监控工具,提供健康检查、性能指标、日志管理等核心功能,支持自定义和扩展端... 目录一、 Spring Boot Actuator 概述二、 集成 Spring Boot Actuat