Had dealt with a similar issue, as well as an issue where all configuration variables was loaded from a database into an in-memory table, and that table was queried with a sql-like structure like a thousand times over a single web request stack (login request was like 25-30s). I swapped it out with a hash table, and that knocked the login request to under 10s, and 9.5s of that was an external system outside my control.
On the race condition, that was actually pretty easy to diagnose and solve, replaced the static property with a local getter/setter using the request context to store the value (asp.net 2.0).
On the race condition, that was actually pretty easy to diagnose and solve, replaced the static property with a local getter/setter using the request context to store the value (asp.net 2.0).