Разгоняем ThreadLocal

Всем серьезным и не очень программистам из мира Java известен данные класс. Он привязывать объект к конкретному потоку. Достаточно часто используется в многопоточных приложениях, наш сервер также не стал исключением. А раз у нас самый многопоточный из многопоточных серверов – то используется данный класс достаточно часто – на одну входящую команду с клиента раз 20 точно. Сегодня я провел тестирование скорости работы данного класса, оказалось всего лишь 7 000 операций get() за одну миллисекунду. Пришлось ускорять и вот каким методом – у каждого Thread есть метод long getId() который возвращает уникальный идентификатор потока, но также не следует забывать, что если поток умирает – то данный идентификатор может реиспользоваться.

А далее вот что получается:

Было:
ThreadLocal threadLocal;
String value = threadLocal.get();


Стало:
String[] threadLocal = new String[10000];
String value = threadLocal[(int)Thread.currentThread().getId];

Ускорение в три раза, но тут есть костыль – массив должен быть большой, чтобы гарантированно хватило. Для решения этой проблемы у меня есть реализация разреженных массивов, но об этом потом.

P.S. Попутно выяснил что реализация очереди ArrayDeque работает в три раза медленней чем пара из массива и счетчика, для её эмуляции.