async ставит блок в очередь и сразу возвращает управление. Вызывающий код не ждёт.
sync не возвращается, пока блок не отработает на целевой очереди. Вызывающий поток в это время стоит.
Дополнительные вопросы
1. На серийной очереди это взаимная блокировка. Очередь занята текущим кодом и ждёт, пока sync закончится, а sync ждёт, пока очередь освободится. На конкурентной очереди блок может пойти параллельно, и такого замка нет.
2. С главного потока sync на главную очередь тоже встаёт навсегда: главный поток ждёт сам себя. С другого потока вызов дождётся, пока главный поток выполнит блок, и на это время остановит вызывающего.
3. Вызывающий поток блокируется, пока блок не закончится на той очереди. Если очередь свободна, блок просто выполняется. Взаимная блокировка будет только когда эта очередь уже ждёт вызывающего, например серийная очередь вызвала sync сама на себя.