Po co używać ReentrantLock, jeśli można korzystać z synchronizacji (tego)?

Próbuję zrozumieć, co sprawia, że ​​blokada współbieżności jest tak ważna, jeśli można jej użyć synchronized (this). W poniższym kodzie atrapy mogę wykonać: zsynchronizował całą metodę lub zsynchronizował wrażliwy obszar ( synchronized(this){...}) LUB zablokuj wrażliwy obszar kodu za pomocą...