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

相关文章

Spring Cloud Hystrix原理与注意事项小结

《SpringCloudHystrix原理与注意事项小结》本文介绍了Hystrix的基本概念、工作原理以及其在实际开发中的应用方式,通过对Hystrix的深入学习,开发者可以在分布式系统中实现精细... 目录一、Spring Cloud Hystrix概述和设计目标(一)Spring Cloud Hystr

Spring Boot整合消息队列RabbitMQ的实现示例

《SpringBoot整合消息队列RabbitMQ的实现示例》本文主要介绍了SpringBoot整合消息队列RabbitMQ的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录RabbitMQ 简介与安装1. RabbitMQ 简介2. RabbitMQ 安装Spring

springMVC返回Http响应的实现

《springMVC返回Http响应的实现》本文主要介绍了在SpringBoot中使用@Controller、@ResponseBody和@RestController注解进行HTTP响应返回的方法,... 目录一、返回页面二、@Controller和@ResponseBody与RestController

JAVA集成本地部署的DeepSeek的图文教程

《JAVA集成本地部署的DeepSeek的图文教程》本文主要介绍了JAVA集成本地部署的DeepSeek的图文教程,包含配置环境变量及下载DeepSeek-R1模型并启动,具有一定的参考价值,感兴趣的... 目录一、下载部署DeepSeek1.下载ollama2.下载DeepSeek-R1模型并启动 二、J

springboot rocketmq配置生产者和消息者的步骤

《springbootrocketmq配置生产者和消息者的步骤》本文介绍了如何在SpringBoot中集成RocketMQ,包括添加依赖、配置application.yml、创建生产者和消费者,并展... 目录1. 添加依赖2. 配置application.yml3. 创建生产者4. 创建消费者5. 使用在

Spring Retry 实现乐观锁重试实践记录

《SpringRetry实现乐观锁重试实践记录》本文介绍了在秒杀商品SKU表中使用乐观锁和MybatisPlus配置乐观锁的方法,并分析了测试环境和生产环境的隔离级别对乐观锁的影响,通过简单验证,... 目录一、场景分析 二、简单验证 2.1、可重复读 2.2、读已提交 三、最佳实践 3.1、配置重试模板

Spring中@Lazy注解的使用技巧与实例解析

《Spring中@Lazy注解的使用技巧与实例解析》@Lazy注解在Spring框架中用于延迟Bean的初始化,优化应用启动性能,它不仅适用于@Bean和@Component,还可以用于注入点,通过将... 目录一、@Lazy注解的作用(一)延迟Bean的初始化(二)与@Autowired结合使用二、实例解

SpringBoot使用Jasypt对YML文件配置内容加密的方法(数据库密码加密)

《SpringBoot使用Jasypt对YML文件配置内容加密的方法(数据库密码加密)》本文介绍了如何在SpringBoot项目中使用Jasypt对application.yml文件中的敏感信息(如数... 目录SpringBoot使用Jasypt对YML文件配置内容进行加密(例:数据库密码加密)前言一、J

Java中有什么工具可以进行代码反编译详解

《Java中有什么工具可以进行代码反编译详解》:本文主要介绍Java中有什么工具可以进行代码反编译的相关资,料,包括JD-GUI、CFR、Procyon、Fernflower、Javap、Byte... 目录1.JD-GUI2.CFR3.Procyon Decompiler4.Fernflower5.Jav

Spring Boot 中正确地在异步线程中使用 HttpServletRequest的方法

《SpringBoot中正确地在异步线程中使用HttpServletRequest的方法》文章讨论了在SpringBoot中如何在异步线程中正确使用HttpServletRequest的问题,... 目录前言一、问题的来源:为什么异步线程中无法访问 HttpServletRequest?1. 请求上下文与线