To prevent a Deadlock from occurring at least one requirement for a
deadlock has to be removed:
1. Mutual exclusion: We can use optimistic locking to
prevent mutual exclusion among resources.
2. Resource holding: A thread has to release all its exclusive
locks if it does not succeed in acquiring all exclusive locks
for resources required.
3. No preemption: We can use timeout period for an
exclusive lock to get free after a given amount of time.
4. Circular wait: We can check and ensure that circular wait
does not occur, when all exclusive locks have been
acquired by all the threads in the same sequence
https://www.scaler.com/topics/operating-system/deadlock-prevention-in-operating-system/