Задача любой синхронизации - не дать разным потокам одновременно изменять данные.
Можете себе представить принтер, на который печатают несколько человек. Если не выстроить их в очередь, то результат вам не понравится.
Ровно так же и с объектами программы. Если к ним есть доступ у нескольких потоков, то результат взаимодействия почти гарантированно приведет к ошибке программы.
Synchronize ставит действие в очередь на ожидание главного потока. Как только тот освобождается, он выполняет это действие и оба потока идут дальше. Главный - своей дорогой, вызвавший Synchronize - своей.
Достаточно просто запомнить - экран - один, вызов только через синхронизацию.
Более полное объяснение заповедей многопоточного программирования несложно найти в сети)