我现在正在开始我的最后一年项目.我将从java和scala的角度研究并发方法.从Java并发模块出来后,我可以看到人们为什么说共享状态线程方法难以推理.由于java线程运行的非确定性方式,您需要担心关键部分,冒着竞争条件和死锁等风险.在1.5中,这种推理得到了一些清晰度,但仍然非常清晰.
在第一个视图中,scala似乎通过actors类删除了这种复杂的推理.这使程序员能够从更顺序的角度开发并发系统,并且更容易概念化.但是,对于这种积极的一面,我是否正确地说有一些缺点?例如,假设我们想在两种情况下对大型列表进行排序 – 使用java创建两个线程将列表拆分为两个,担心关键部分,原子操作等并转到代码.使用scala,因为它“无分享”你实际上必须将list / 2传递给两个actor以执行排序操作,对吗?
我想我的问题是你为更简单的推理付出的代价是在scala中必须将集合传递给你的演员的性能开销吗?
我正在考虑对这种效果做一些基准测试(选择排序,快速排序等;)但是因为一个是功能性的而且一个是必要的 – 我不会从算法的角度比较苹果和苹果.
我真的很感激你们上面提到的任何观点给我一些想法让我开始.
非常感谢.
解决方法:
Scala的优点在于,如果需要,可以使用Java方式进行并发.所有Java类都可用.
因此,它实际上归结为一个模型与模块之间的区别,在模型中,线程具有对可变变量的并发访问权限,而模型中有有状态的actor,它们彼此发送消息但不会窥视彼此的内部.而且你绝对正确,在某些情况下你必须权衡性能,以便轻松获得正确的代码.
我通常会发现,作为一个粗略的经验法则,如果你要花费大量时间等待锁打开,使用Java模型,并且没有干净的方法来分离工作为了避免每个人都在等待该资源,并且如果执行在线程之间快速切换,那么Java模型远远优于演员模型,其中演员将“我已完成”的消息发送回主管,然后主管发送出去“这是新作品!”消息给现有的非忙碌演员.排序算法,取决于您如何设想它们,可以非常属于这一类.
对于大多数其他事情而言,与演员相关的表现损失并不像我所见.如果你可以把你的问题想象成很多很多被动元素(即他们只有在收到消息时才需要时间),那么演员可以特别好地扩展(数百万可用,但只有少数可以在任何特定时刻工作) ;对于线程,你需要有一些额外的内部状态来跟踪谁应该做什么工作,因为你无法处理那么多活动线程.
原文地址:https://codeday.me/bug/20190730/1579317.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。