Truth be told, it is trivially easy to create deadlocks even in a pure message-passing environment such as Erlang. Message-passing is way oversold and doesn't solve as many problems as people think.
My experience with Erlang has been that it solves a great deal of concurrency problems and is way undersold.