Ayende @ Rahien

My name is Oren Eini
Founder of Hibernating Rhinos LTD and RavenDB.
You can reach me by phone or email:


+972 52-548-6969

, @ Q c

Posts: 6,007 | Comments: 44,761

filter by tags archive

Detailed Answer: Your own ThreadLocal

time to read 4 min | 691 words

Originally posted at 12/15/2010

In the last post, we have shown this code:

public class CloseableThreadLocal
    public static Dictionary<object, object> slots;

    private readonly object holder = new object();
    private Dictionary<object, object> capturedSlots;

    private Dictionary<object, object> Slots
            if (slots == null)
                slots = new Dictionary<object, object>();
            capturedSlots = slots;
            return slots;

    public /*protected internal*/ virtual Object InitialValue()
        return null;

    public virtual Object Get()
        object val;

        lock (Slots)
            if (Slots.TryGetValue(holder, out val))
                return val;
        val = InitialValue();
        return val;

    public virtual void Set(object val)
        lock (Slots)
            Slots[holder] = val;

    public virtual void Close()
        if (capturedSlots != null)

        if (capturedSlots == null)
        lock (capturedSlots)

And then I asked whatever there are additional things that you may want to do here.

The obvious one is to thing about locking. For one thing, we have now introduced locking for everything. Would that be expensive?

The answer is that probably not. We can expect to have very little contention here, most of the operations are always going to be on the same thread, after all.

I would probably just change this to be a ConcurrentDictionary, though, and remove all explicit locking. And with that, we need to think whatever it would make sense to make this a static variable, rather than a thread static variable.



each instance is still only cleanning up the last thread's slots var that used it. The captured slots needs to be a list that will contain all the slots vars that that used the holder of a specific instance, and the d'tor needs to iterate over all those slots and clean them all up

  • you should cleanup:

  • after thread dies (threadstatic class with finalizer)

  • after closablethreadlocal goes out of scope

Also you'll probably need to sync this list both in Slots getter and in destructor(s)

Comment preview

Comments have been closed on this topic.


No future posts left, oh my!


  1. Speaking (3):
    23 Sep 2015 - Build Stuff 2015 (Lithuania & Ukraine), Nov 18 - 24
  2. Production postmortem (11):
    22 Sep 2015 - The case of the Unicode Poo
  3. Technical observations from my wife (2):
    15 Sep 2015 - Disk speeds
  4. Find the bug (5):
    11 Sep 2015 - The concurrent memory buster
  5. Buffer allocation strategies (3):
    09 Sep 2015 - Bad usage patterns
View all series



Main feed Feed Stats
Comments feed   Comments Feed Stats