| `ThreadLocal`s should be stored in `static` variables to avoid memory leaks. If |
| a `ThreadLocal` is stored in an instance (non-static) variable, there will be |
| <code>M \* N</code> instances of the `ThreadLocal` value where `M` is the number |
| of threads, and `N` is the number of instances of the containing class. Each |
| instance may remain live as long the thread that stored it stays live. |
| |
| Example: |
| |
| ```java |
| class C { |
| private final ThreadLocal<D> local = new ThreadLocal<D>(); |
| |
| public f() { |
| D d = local.get(); |
| if (d == null) { |
| d = new D(this); |
| local.set(d); |
| } |
| d.doSomething(); |
| } |
| } |
| ``` |
| |
| The fix is often to make the field `static`: |
| |
| ```java |
| private static final ThreadLocal<D> local = new ThreadLocal<D>(); |
| ``` |