`synchronized` vs `ReentrantLock`: what are the differences? | LetsGit.IT