게임에서는 대부분의 로직이 다른 로직에 영향을 끼치기 때문입니다. (정확히는 변수값)
예를 들어, A가 B를 공격한다는 패킷이 왔을 때, A가 자신에게 먼저 락을 걸고 B의 변수를 변경하기 위해 B에게도 락을 걸려고 합니다.
그런데, 동시에 B도 A를 공격하려고 했고, B도 자신에게 락을 걸고 A도 락을 걸려고 대기를 합니다.
이러면 서로 락을 걸려고 대기하는 상태가 되어 버려서, 데드락에 걸려 버리죠.
락이 안 걸리게 커맨드 큐를 만들어서 비동기로 처리하게 할 수도 있지만 그렇게 만들면 구조가 너무 복잡해지고, 만약 같은 Tick에서 바로 처리해야 하는 경우엔 답이 안 나옵니다.
애초에 변수 하나 수정할 때마다 락을 걸어야 한다면, 코딩도 복잡해집니다.
게다가 락을 건다는 것 자체도 CPU에 부하를 주기 때문에 그런 코드가 많아지면 전체적인 퍼포먼스도 별로 안 좋아지게 됩니다.
여러 가지 이유로 게임 로직의 경우 그냥 스레드 하나에서 다 처리하는 게 간편하고 안전합니다.
다른 모듈에 전혀 영향을 안 주고 혼자서만 처리가 가능한 로직이라면 딱히 상관없습니다.