Erlang, the language that first popularized actors has immutability at
its core but Java and Scala (actually the JVM) does not enforce
2- Still pretty complex
Actors are based on an asynchronous model of programming which is not so straight forward and easy to model in all scenarios; it is particularly difficult to handle errors and failure scenarios.
3- Does not prevent deadlock or starvation
Two actors can be in the state that wait message one from another; thus
you have a deadlock just like with locks, although much easier to debug.
With transactional memory however you are guaranteed deadlock free.
4- Not so efficient
Because of enforced immutability and because many actors have to switch
in using the same thread actors won't be as efficient as lock-based concurrency.