diff --git a/akka-actor/src/main/scala/akka/actor/ActorRef.scala b/akka-actor/src/main/scala/akka/actor/ActorRef.scala index 80ed2bbca5..df87360c65 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorRef.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorRef.scala @@ -194,7 +194,7 @@ private[akka] abstract class InternalActorRef extends ActorRef with ScalaActorRe /* * Actor life-cycle management, invoked only internally (in response to user requests via ActorContext). */ - def start(): ActorRef + def start(): Unit def resume(causedByFailure: Throwable): Unit def suspend(): Unit def restart(cause: Throwable): Unit @@ -260,10 +260,13 @@ private[akka] class LocalActorRef private[akka] ( /* * Safe publication of this class’s fields is guaranteed by mailbox.setActor() - * which is called indirectly from actorCell.start() (if you’re wondering why + * which is called indirectly from actorCell.init() (if you’re wondering why * this is at all important, remember that under the JMM final fields are only * frozen at the _end_ of the constructor, but we are publishing “this” before * that is reached). + * This means that the result of newActorCell needs to be written to the val + * actorCell before we call init and start, since we can start using "this" + * object from another thread as soon as we run init. */ private val actorCell: ActorCell = newActorCell(_system, this, _props, _supervisor) actorCell.init(ThreadLocalRandom.current.nextInt(), sendSupervise = true) @@ -284,10 +287,10 @@ private[akka] class LocalActorRef private[akka] ( */ override def isTerminated: Boolean = actorCell.isTerminated - override def start(): ActorRef = { - actorCell.start() - this - } + /** + * Starts the actor after initialization. + */ + override def start(): Unit = actorCell.start() /** * Suspends the actor so that it will not process messages until resumed. The @@ -400,7 +403,7 @@ private[akka] trait MinimalActorRef extends InternalActorRef with LocalRef { override def getParent: InternalActorRef = Nobody override def getChild(names: Iterator[String]): InternalActorRef = if (names.forall(_.isEmpty)) this else Nobody - override def start(): ActorRef = this + override def start(): Unit = () override def suspend(): Unit = () override def resume(causedByFailure: Throwable): Unit = () override def stop(): Unit = () diff --git a/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala b/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala index 03c66ec12e..b644ba6445 100644 --- a/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala +++ b/akka-actor/src/main/scala/akka/actor/RepointableActorRef.scala @@ -78,10 +78,10 @@ private[akka] class RepointableActorRef( * unstarted cell. The cell must be fully functional. */ def newCell(old: Cell): Cell = - new ActorCell(system, this, props, supervisor) - .init(old.asInstanceOf[UnstartedCell].uid, sendSupervise = false).start() + new ActorCell(system, this, props, supervisor). + init(old.asInstanceOf[UnstartedCell].uid, sendSupervise = false).start() - def start(): ActorRef = this + def start(): Unit = () def suspend(): Unit = underlying.suspend() diff --git a/akka-actor/src/main/scala/akka/actor/dungeon/Children.scala b/akka-actor/src/main/scala/akka/actor/dungeon/Children.scala index 63d312fa8d..d59b0b71da 100644 --- a/akka-actor/src/main/scala/akka/actor/dungeon/Children.scala +++ b/akka-actor/src/main/scala/akka/actor/dungeon/Children.scala @@ -193,6 +193,7 @@ private[akka] trait Children { this: ActorCell ⇒ if (mailbox ne null) for (_ ← 1 to mailbox.suspendCount) actor.suspend() initChild(actor) actor.start() + actor } } diff --git a/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala b/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala index 3f13f39f75..87c66522b4 100644 --- a/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala +++ b/akka-remote/src/main/scala/akka/remote/RemoteActorRefProvider.scala @@ -243,7 +243,7 @@ private[akka] class RemoteActorRef private[akka] ( provider.deadLetters ! message } - def start(): ActorRef = this + def start(): Unit = () def suspend(): Unit = sendSystemMessage(Suspend())