Avoid race conditions by execute tasks sequentially even across different threads. guarantee only one task is running at a time