Currently I use a single lock which is used to manage movement of threads between their 3 states: 1) not monitored, 2) healthy and 3) over-running. So states 2) and 3) use different unsynchronized collections and the synchronization is a level above in all of the logic that is managing these state transitions.
I could use a single collection with a status field but I wanted a fast way of enumerating just the occasional over-running threads without also considering the many healthy threads.