Locking is not just to prevent concurrent lookups/updates (which is required in use of timeOutDeadWorkers), but also to ensure visibility of updates between threads : this (second issue) is a general problem in other parts of spark too btw ...
We had done some work on a private branch to alleviate this, but abandoned it due to lack of time.

You are right that this is an existing issue - the compare and update just made me notice it here.