Akka Java Documentation, Release 2.4.2
it finishes in a bounded number of steps. All lock-free objects are obstruction-free, but the opposite is generally
not true.
Optimistic concurrency control (OCC) methods are usually obstruction-free. The OCC approach is that every
participant tries to execute its operation on the shared object, but if a participant detects conflicts from others, it
rolls back the modifications, and tries again according to some schedule. If there is a point in time, where one of
the participants is the only one trying, the operation will succeed.
2.1.7 Recommended literature
• The Art of Multiprocessor Programming, M. Herlihy and N Shavit, 2008. ISBN 978-0123705914
• Java Concurrency in Practice, B. Goetz, T. Peierls, J. Bloch, J. Bowbeer, D. Holmes and D. Lea, 2006.
ISBN 978-0321349606
2.2 Actor Systems
Actors are objects which encapsulate state and behavior, they communicate exclusively by exchanging messages
which are placed into the recipient’s mailbox. In a sense, actors are the most stringent form of object-oriented
programming, but it serves better to view them as persons: while modeling a solution with actors, envision a group
of people and assign sub-tasks to them, arrange their functions into an organizational structure and think about
how to escalate failure (all with the benefit of not actually dealing with people, which means that we need not
concern ourselves with their emotional state or moral issues). The result can then serve as a mental scaffolding for
building the software implementation.
Note: An ActorSystem is a heavyweight structure that will allocate 1. . . N Threads, so create one per logical
application.
2.2.1 Hierarchical Structure
Like in an economic organization, actors naturally form hierarchies. One actor, which is to oversee a certain
function in the program might want to split up its task into smaller, more manageable pieces. For this purpose it
starts child actors which it supervises. While the details of supervision are explained here, we shall concentrate on
the underlying concepts in this section. The only prerequisite is to know that each actor has exactly one supervisor,
which is the actor that created it.
The quintessential feature of actor systems is that tasks are split up and delegated until they become small enough
to be handled in one piece. In doing so, not only is the task itself clearly structured, but the resulting actors can
be reasoned about in terms of which messages they should process, how they should react normally and how
failure should be handled. If one actor does not have the means for dealing with a certain situation, it sends a
corresponding failure message to its supervisor, asking for help. The recursive structure then allows to handle
failure at the right level.
Compare this to layered software design which easily devolves into defensive programming with the aim of not
leaking any failure out: if the problem is communicated to the right person, a better solution can be found than if
trying to keep everything “under the carpet”.
Now, the difficulty in designing such a system is how to decide who should supervise what. There is of course no
single best solution, but there are a few guidelines which might be helpful:
• If one actor manages the work another actor is doing, e.g. by passing on sub-tasks, then the manager should
supervise the child. The reason is that the manager knows which kind of failures are expected and how to
handle them.
• If one actor carries very important data (i.e. its state shall not be lost if avoidable), this actor should source
out any possibly dangerous sub-tasks to children it supervises and handle failures of these children as ap-
propriate. Depending on the nature of the requests, it may be best to create a new child for each request,
2.2. Actor Systems 12