线程通信机制—共享内存:消息传递

线程通信机制—共享内存:消息传递在并发编程中,我们必须考虑的问题时如何在两个线程间进行通讯。这里的通讯指的是不同的线程之间如何交换信息。目前有两种方式:1、共享内存2、消息传递(actor模型) 共享内存共享内存这种方式比较常见,我们经常会设置一个共享变量。然后多个线程去操作同一个共享变量。从而达到线程通讯的目的。例如,我们使用多个线程去执行页面抓取任务,我们可以使用一个共享变量count来记录任务

大家好,又见面了,我是你们的朋友全栈君。

在并发编程中,我们必须考虑的问题时如何在两个线程间进行通讯。这里的通讯指的是不同的线程之间如何交换信息。

目前有两种方式:

1、共享内存

2、消息传递(actor 模型)

 


共享内存

共享内存这种方式比较常见,我们经常会设置一个共享变量。然后多个线程去操作同一个共享变量。从而达到线程通讯的目的。例如,我们使用多个线程去执行页面抓取任务,我们可以使用一个共享变量count来记录任务完成的数量。每当一个线程完成抓取任务,会在原来的count上执行加1操作。这样每个线程都可以通过获取这个count变量来获得当前任务的完成情况。当然必须要考虑的是共享变量的同步问题,这也共享内存容易出错的原因所在。

线程通信机制---共享内存:消息传递

这种通讯模型中,不同的线程之间是没有直接联系的。都是通过共享变量这个“中间人”来进行交互。而这个“中间人”必要情况下还需被保护在临界区内(加锁或同步)。由此可见,一旦共享变量变得多起来,并且涉及到多种不同线程对象的交互,这种管理会变得非常复杂,极容易出现死锁等问题。

 


消息传递

消息传递方式采取的是线程之间的直接通信,不同的线程之间通过显式的发送消息来达到交互目的。消息传递最有名的方式应该是actor模型了。在这种模型下,一切都是actor,所有的actor之间的通信都必须通过传递消息才能达到。每个actor都有一个收件箱(消息队列)用来保存收到其他actor传递来的消息。actor自己也可以给自己发送消息。这才是面向对象的精髓啊!

线程通信机制---共享内存:消息传递

这种模型看起来比共享内存模型要复杂。但是一旦碰到复杂业务的话,actor模型的优势就体现出来了。我们还是以刚才多线程抓取网站为例子看一下在这种模型下如何去解决。

 

首先我们定义一个统计actor用来统计任务完成量。然后把多个网址(消息方式)发给多个抓取actor,抓取actor处理完任务后发送消息通知统计actor任务完成,统计actor对自己保存的变量count(这个只有统计actor才能看到)加一。

 

最后让我们来总结一下这两种通讯模式:

并发模型 通信机制 同步机制
共享内存

线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信。

同步是显式进行的。程序员必须显式指定某个方法或某段代码需要在线程之间互斥执行。

消息传递(actor)

线程之间没有公共状态,线程之间必须通过明确的发送消息来显式进行通信。

由于消息的发送必须在消息的接收之前,因此同步是隐式进行的。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/160361.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 7000字 Redis 超详细总结笔记总 | 收藏必备!

    7000字 Redis 超详细总结笔记总 | 收藏必备!

  • SSL工作原理

    SSL工作原理

    2021年12月14日
  • 获取计算机用户名 方法是什么_计算机获取视频信息的方法

    获取计算机用户名 方法是什么_计算机获取视频信息的方法StringosUser=System.getProperty(“user.name”);//获取计算机用户名称 StringfilePath=”C:/Users/”+osUser+”/Downloads/”;

    2022年10月15日
  • 在 IT 外包公司工作有哪些优势和弊端?

    在 IT 外包公司工作有哪些优势和弊端?看外包公司的性质,有的是外包人力,有的是承接外包项目在自己公司做,有的是承接项目在外包公司做,也有的公司上面这几项同时做,同时也可能开发自己的产品。对用人单位来讲,短期看我喜欢外包人力,因为能解决公司人力紧缺的问题,同时外包人员和项目组成员配合更紧密,对项目出活有好处。我自己的亲身体会是,外包公司派过来的人一般要比自己的员工更努力,不挑活,他们希望通过好好表现,将来可以留在外派公司里。长期来看,我…

  • opengl 透视投影矩阵_matlab投影函数

    opengl 透视投影矩阵_matlab投影函数图形学惯例下的平行投影矩阵推导首先,确定我们使用以下惯例:将视图坐标系中的顶点Pe变换到NDC坐标系中的顶点Pn。视图坐标系使用右手坐标系,NDC也使用右手坐标系。NDC范围为-1<=x<=1,-1<=y<=1,-1<=z<=1NDC和屏幕的对应关系为:x=1的点在屏幕右边,x=-1在左边;y=1在顶部,y=-1在底部;z=1的点距…

  • Python websocket_php需要编译吗

    Python websocket_php需要编译吗这里很坑爹………地址换了….网上到处都是旧的github地址….更郁闷的是旧地址的代码在centos等各个linux都能编译通过,但是到了mac就郁闷了,各种报错…..坑爹来的然后很多人说hs没在维护了,那是因为他们看到的是旧的git代码地址….囧…..搞死我了,我还真以为他不更新了,看到git项目,3年没更新了,心都凉了……各种找错误各种…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号