You could still run 10 threads on a single core, so I don't know what you are trying to achieve...
You should be looking for situations in your code where:
Thread A is blocked awaiting a resource / lock that is locked by thread B, and Thread B is blocked awaiting a resource / lock that is locked by thread A.
In other words, look for scenarios where a running thread takes locks on more than one resource - that's your starting point...