https://github.com/foobatman/producer-consumer-akka-actor/tr...
There are many more examples out there. Anything that a multi-threaded program can do, an actor can do..
I just think that actors are inherently more complex than threads for simple problems. For complex problems, I think actor are probably a better choice.
A good example of a simple program is managing multiple TCP connections. At least in my (somewhat limited) experience with actors, polling TCP file descriptors is easier to manage creating an actor for each one.
Really, it's not obvious? Of course you can: instead of shared memory you now have each actor having its own memory, instead of using locks and working on shared memory you now have messages and can ask actors to do something with their memory and send you the result back.
You can implement locks using actors if you really want to. An actor represents the state of the lock and stores which actor locked it and only responds to the unlock message from that actor and ignores all lock and unlock messages from all the other actors until it is unlocked.
Like, show me the producer-consumer pattern using actors.