Say*_*ald 8 concurrency scala atomic akka
什么是一个很好的并发原语来访问CPU绑定的对象(没有IO和网络)?
例如,有一个FooCounter,其中有一个方法得到(),()设置和INC()为VAR计数器:诠释,也被中线程的千百万共享.
object FooCounter{
var counter: Int = 0;
def get() = counter
def set(value: Int) = {counter = counter + value}
def inc() = counter + 1
}
Run Code Online (Sandbox Code Playgroud)
我发现大多数关于Scala的文献都是针对Akka的.对我来说,似乎Actor模型并不适合这项任务.
还有Futures/Promises,但它们适用于阻止任务.
在Java中,有一个很好的原始Atomics使用锁存器,这对于这项任务非常强大和下降.
更新: 我可以使用Java原语来完成这个简单的任务.但是,我的目标是在这个简单的例子中使用和学习Scala Concurrency模型.
axe*_*l22 11
您应该知道您的实现FooCounter不是线程安全的.如果多个线程同时调用get,set和inc方法,也不能保证计数将是准确的.您应该使用以下实用程序之一来实现正确的并发计数器:
synchronized语句(Scala synchronized语句类似于Java中的语句)其他Scala并发实用程序,例如期货和承诺,并行集合或反应式扩展,不是最适合实现并发计数器,并且具有不同的用法.
您应该知道Scala在某些情况下会重用Java并发基础结构.例如 - Scala不提供自己的原子变量,因为Java原子类已经完成了这项工作.相反,Scala旨在提供更高级别的并发抽象,例如actor,STM和异步事件流.
为了评估实施的运行时间和效率,ScalaMeter是一个不错的选择.该网站的在线文档包含有关如何进行基准测试的详细示例.
虽然Akka是最受欢迎且记录最好的Scala并发实用程序,但还有许多其他高质量的实现,其中一些更适合于不同的任务:
我认为在Scala中学习并发编程对你来说可能是一本好书.它包含Scala中不同并发样式的详细文档,以及何时使用哪些样式的说明.第5章和第9章也涉及基准测试.具体而言,在本书的第9章中描述,优化并可扩展并发计数器实用程序.
免责声明:我是作者.
| 归档时间: |
|
| 查看次数: |
6720 次 |
| 最近记录: |