동시성 프로그래밍에서 발생하는 대부분의 오류는 shared mutable state, 즉 변경 가능한 상태를 여러 곳에서 공유하는 데에서 온다. 이 문제에 대한 전통적인 방법은 락으로 임계 영역(critical section)을 만드는 것이지만, 어느 락이 어느 변수를 맡는지는 온전히 프로그래머의 머리에 맡겨야 했고, 실수로 규칙을 어겨도 딱히 알아차릴 방법이 없는 데다, 포인터를 만드는 게 밥먹는 것만큼 쉬운 C/C++와 같은 언어와 같은 객체에 대한 레퍼런스를 만드는 게 숨쉬는 것만큼 쉬운 Java나 Python 같은 언어에서 이런 실수는 굉장히 간단히 일어날 수 있다.