Looking for java Keywords? Try Ask4Keywords

Java Language Использование ThreadLocal


пример

Полезным инструментом в Java Concurrency является ThreadLocal - это позволяет вам иметь переменную, которая будет уникальной для данного потока. Таким образом, если один и тот же код работает в разных потоках, эти исполнения не будут совместно использовать значение, но вместо этого каждый поток имеет свою собственную переменную, которая является локальной для потока .

Например, это часто используется для установления контекста (например, информации авторизации) обработки запроса в сервлете. Вы можете сделать что-то вроде этого:

private static final ThreadLocal<MyUserContext> contexts = new ThreadLocal<>();

public static MyUserContext getContext() {
    return contexts.get(); // get returns the variable unique to this thread
}

public void doGet(...) {
    MyUserContext context = magicGetContextFromRequest(request); 
    contexts.put(context); // save that context to our thread-local - other threads
                           // making this call don't overwrite ours
    try {
        // business logic
    } finally {
        contexts.remove(); // 'ensure' removal of thread-local variable
    }
}

Теперь вместо того, чтобы передавать MyUserContext в каждый отдельный метод, вы можете вместо этого использовать MyServlet.getContext() где он вам нужен. Теперь, конечно, это вводит переменную, которая должна быть документирована, но она поточно-безопасна, что устраняет множество недостатков для использования такой переменной с высокой степенью охвата.

Ключевым преимуществом здесь является то, что каждый поток имеет свою собственную локальную переменную потока в контейнере contexts . Пока вы используете его из определенной точки входа (например, требуя, чтобы каждый сервлет поддерживал свой контекст или, возможно, добавляя фильтр сервлета), вы можете полагаться на этот контекст, когда он вам нужен.