【问题标题】:what would be the parallel java "actor" code to replace standard synchronization with threads code用线程代码替换标准同步的并行java“actor”代码是什么
【发布时间】:2012-04-26 03:00:17
【问题描述】:

如果我有这个同步代码,我想用没有同步的演员替换,怎么做?

public synchronized int incrementAndGet() {
  i = i + 1;
  return i;
}

我在网站上有一群用户,我需要为每个用户返回一个递增的数字... 我如何用没有同步的演员代码替换该代码,因此没有阻塞同步代码。我想这将能够在多核等上运行它(这不是演员的目的吗?)。

【问题讨论】:

  • 这是 Akka 代理的完美用例。

标签: java scala concurrency actor akka


【解决方案1】:

一个简单的actor将i包装在它的内部状态中:

case object Inc

class IncrementingActor extends Actor {
    var i = 0

    protected def receive = {
        case Inc =>
            i += 1
            sender ! i
    }
}

并阻止使用(您需要以某种方式获得incrementAndGet):

import akka.pattern.ask

def incrementAndGet() = 
  Await.result((incrementingActor ? Inc).mapTo[Int], 1 seconds)

这段代码:缓慢、复杂且不习惯。 AtomicInteger呢?

【讨论】:

  • 我不想使用 atomicinteger,我不想使用同步,互联网上到处都是说演员可以用没有同步的演员的新多线程代码替换旧的多线程代码,所以我建议例如,我只是看到你告诉我演员不能解决问题!!!我仍然必须做 Await.result 或 AtomicInteger 这就像写同步!演员不解决我的问题然后对!? (在我的例子中)。 (对不起,如果我听起来很沮丧,大多数教程都说演员是多线程同步代码的神奇解决方案,我只是看到它不是!)
  • 问题在于,对于您选择的示例,使用 AtomicInteger 可能是最好的解决方案。而且 AtomicInteger 使用了与同步不同的比较和交换。
【解决方案2】:

并发是一个包含多个问题和陷阱的广阔领域。没有一种方法能够解决所有问题,真正的并发专家能够结合多种方法来获得最佳结果。

目前在 JVM 世界中,我认为没有比原子整数更好的替代方法来增加计数器,尤其是在争用非常高的情况下。

话虽如此,如果您想使用演员,获得性能和可伸缩性的诀窍是尽可能避免 ask (?) 操作。改用 tell (!) 然后让步。当结果可用时,actor 将接收它并恢复控制。没有任何阻塞,线程池同时能够处理其他参与者。这只有在大多数代码都在演员内部时才有效。

从 Thomas 解决方案开始,您可以编写如下内容:

case object Inc
case class Count(i)

class IncrementingActor extends Actor {
   var i = 0
   protected def receive = {
     case Inc =>
        i += 1
        sender ! Count(i)
  }
}

class FooActor( counter: ActorRef ) extends Actor {
  protected def receive = {
    case DoSomething() => {
      // Perform some work
      counter ! Inc
    }
    case Count(i) => {
      // Do something with the counter result   
    }
  }
}

【讨论】:

    【解决方案3】:

    如果你想使用一个actor,同步递增一个计数器(如incrementAndGet())几乎没有什么好处。从视图中隐藏实际上是演员邮箱中的同步。此外,AtomicInteger 类在多核架构上也能正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-06
      相关资源
      最近更新 更多