title: How are message-passing concurrent languages better than shared-memory concurrent languages in practice
body: <p>I've been a Java developer for many years but never had to deal too much with concurrency issues until I started doing Android development, and suddenly started finding "application not responding" and apparent deadlock situations.  </p>
  
  <p>This made me realize how hard it can be to understand and to debug some of these concurrency issues.  How do new languages such as Scala and Go improve concurrency?  How are they more understandable and how do they prevent concurrency bugs? Can someone provide real-world examples that demonstrates the advantages? </p>