For a deadlock to occur following are the minimum requirements:
1. Mutual exclusion: There has to be a resource that can be
accessed by only one thread at any point of time.
2. Resource holding: One thread locks one resource and
holds it, and at the same time it tries to acquire lock on
another mutually exclusive resource.
3. No preemption: There is no pre-emption mechanism by
which resource held by a thread can be freed after a
specific period of time.
4. Circular wait: There can be a scenario in which two or
more threads lock one resource each and they wait for
each other’s resource to get free. This causes circular wait
among threads for same set of resources.
https://www.scaler.com/topics/operating-system/deadlock-in-os/