I have found that dispatch_sync() is a poor way to do locking, it does not support nested calls.
So you can't call dispatch_sync on a serial Q and then call it again in a subroutine with the same Q. Which means it does not behave in the same way as @synchronized does at all.