并发编程的三大核心问题(三)

分工问题

一个较大的任务被拆分为多个大小合适的问题,这些大小合适的问题被交给合适的线程去执行.分工强调的是执行的性能.

类比现实案例

比如一个上市公司的CEO,其主要的工作是:规划公司的战略方向和管理好公司.如何管理好公司,涉及的任务及比较多.
在这里将如何管理好公司看作一个较大的任务,这个很大的任务可以分为:人员招聘和管理,产品设计,神品研发,产品运营,产品推广,税务统计和计算等.例如下图

在这里插入图片描述

从上图看这不是一个好的方式,很好的方式是分解公司的日常工作,将人员招聘和管理交给人力资源部,将产品设计交给设计部,将产品开发交给研发部,将产品运营和产品推广分别交给运营部和市场部,将公司的税务统计与计算交给财务部,如下:

在这里插入图片描述

将公司的日常工作明确分工后,可以发现各部门的工作是可以并行推进的.在现实生活中,安排合适的人去做合适的事情真的非常重要.映射到并发编程中也是同样的道理.

并发编程中的分工

在并发编程中,同样将一个大的任务拆分为若干个比较小的任务,并将这些小的任务交给不同的线程去执行.

在这里插入图片描述

在并发编程中,由于多个线程可以并发执行,所以在一定程度上提高任务的执行效率.
在java中,线程池,Fork/Join框架和Future接口都是实行分工的方式.在多线程设计模式中,Guared Suspension模式,Thread-Per-Message模式,生产者消费者模式,两阶段终止模式,Worker-Thread模式和Balking模式都是分工问题的实现方式.

同步问题

在并发编程中,同步是指一个线程执行完自己的任务后,以何种方式通知其他线程继续执行任务,也可以将其理解为线程之间的协作,同步强调的执行的性能.

类比现实案例

例如张三,李四和王五共同开发一个项目,张三是前端,他需要等待李四的开发接口任务完成再开始渲染也买你,而李四又需要等待王五的服务开发工作完成之后在写接口.也即是说,任务之间存在依赖关系,前面的任务完成后,才能执行后面的.

在现实生活中,这种任务的同步,更多的是靠人与人之间的交流和沟通来完成.王五的服务开发工作完成之后,告诉李四,李四再开始开发接口任务,等李四接口开发完成之后再来告诉张三,再由张三来开发页面渲染工作.如图:

在这里插入图片描述
并发编程中的同步

在并发编程中,同步机制指一个线程任务执行完成,通知其他线程继续执行任务的方式

在这里插入图片描述

在并发编程中,多个线程的任务之间有依赖关系的,线程1需要阻塞等待线程二执行完任务才能执行任务,线程二需要阻塞等待线程三任务完成之后才能执行.线程三任务完成唤醒线程二,线程二任务完成后唤醒线程一.

在并发编程中,同步机制一个典型的模型-->生产者-消费者模型.如果队列已满,则生产者线程需要等待,如果队列不满,则需要唤醒生产者线程;如果队列为空,则消费者线程需要等待,如果队列不为空则需要唤醒消费者.

在java中,Semaphore,Lock,synchronized,CountDownLatch,CyclicBarrier,Exchanger和Phaser等工具会框架实现了同步机制.

互斥问题

互斥问题一般指同一时刻只允许一个线程访问临界区的共享资源.互斥强调的是多个线程执行任务时的正确性.

类比现实案例

交叉路口的多俩车汇入一个单行道,当多俩车经过交叉路口汇入同一单行道时,由于单行道的入口只能容纳一俩车通过,所以其它车俩需要等待前面的车通过路口后,再一次有序的通过单行道.如下图:

在这里插入图片描述
并发编程中的互斥

在并发编程中,分工和同步强调的是任务的执行性能,而互斥强调的是执行任务的正确性,也是现成的安全性.如果在并发编程中,多个线程同时进入临界区访问同一个共享变量,则可能产生线程安全问题,这是由线程的原子性,可见性和有序性问题导致的.

而在并发编程中解决原子性,可见性和有序性问题的核心方案就是线程的互斥.

例如,可以使用JVM中提供的synchronized锁来实现多个线程之间互斥
除了synchronized锁,Java还提供ThreadLocal,CAS,原子类和以CopyOnWtite开头的并发容器类,Lock锁以及读/写锁等,他们都实现了线程的互斥机制.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

double_lifly

点喜欢就是最好的打赏!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值