I have some scheduled jobs in my SQL Agent:
Use a session lock via sp_getapplock
You're asking for user-controlled concurrency and this is usually the best way.
This allows you to wait or abort if the lock is already held by another job. We use it in one or 2 places to stop multiple users forcing the same task to run overlapping. It works well.