the problem is that the next job starts while the previous is running (=race condition) and not after the previous one finishes
How many queue workers you have? Maybe leave only one, then jobs will be executed strictly one after another.
Make syncronize job set a global flag (using cache for example) synchronized = 1 right after successful synchronization. A job should check this flag before exectuion and proceed only if synchronized = 0, otherwise exit. System A, when it's data changes, sets this flag to 0 along with dispatching a job.
With this approach only first job actually syncs data, others end quickly without any actions, no matter how many jobs are queued.