2010-10-18 2 views
8

Каково типичное использование ThreadLocal в java. Когда это можно использовать? Я не мог заявить подробности из этой статьи java docs.Использование ThreadLocal

+2

возможно дубликат [Когда и как я должен использовать ThreadLocal переменную?] (Http://stackoverflow.com/questions/817856/when-and-how-should-i-use-a-threadlocal- переменная) – YoK

ответ

4

Используется для использования объектов, которые не являются потокобезопасными, но не хотят синхронизировать с ними доступ (по соображениям производительности). Более или менее вы создаете аксессуар для объекта, который вам нужно использовать несколько раз, чтобы вы гарантировали, что каждый поток, который может вызвать этот аксессуар, получает другой, неиспользуемый. Очень типичное использование для использования SimpleDateFormat, который является классом, который, если бы он был потокобезопасным, ваш экземпляр будет объявлен как статический, чтобы повторно использовать один и тот же экземпляр.

Вот хорошая статья, описывающая его: Dr. Dobbs: Using Thread-Local Variables In Java

4

Может быть более показательным примером может быть хорошо для вас:

method1(): ... method2(somedata) ... 
method2(somedata): ... method3(somedata) ... 
method3(somedata): ... method4(somedata) ... 
method4(somedata): ... do something with somedata ... 

Такие ситуации возникают, например, в многоуровневых архитектур (UI вызывает удаленный фасад, удаленный прикладной уровень наложения фасадов, слой уровня приложений называет уровень домена, уровень сохранения на уровне домена, ...) Если эти методы() относятся к разным классам, нет хорошего способа передать такие данные, кроме добавления дополнительного параметра «somedata» для большинства методов в нашем кода, это нарушает, например, принцип открытого закрывания. Решение этой проблемы является ThreadLocal:

method1(): ... threadLocal.set(somedata); method2(); threadLocal.set(null); ... 
method2(): ... method3() ... 
method3(): ... method4() ... 
method4(): ... do something with threadLocal.get() ... 
5

Я бы сказал, что наиболее типичный ThreadLocal использования, когда у вас есть какой-то объект, который должен быть доступен везде в течение одного потока, и вы не хотите, чтобы передать ссылку на этот объект поверх всех слоев. Что-то вроде шаблона singleton, но за поток.

Примерами являются соединение с БД, спящий сеанс и т. Д. Вы открываете их где-то в начале потока, фиксируете/закрываете в конце потока и используете всюду во время потока.

0

Если ваш поток привязан к нити, как упоминалось в AlexR, вы можете создать public final class C с свойством private static final ThreadLocal<T> p, добавить методы доступа. Затем вы можете использовать p.set(), p.remove() и p.get() соответственно вдоль вашего потока.

public final class C { 
    private static final ThreadLocal<String> p = new ThreadLocal<String>(); 

    // initialize property at the begining of your thread (flow) 
    public static void set(final String s){ 
     p.set(s); 
    } 

    // use property during the thread's lifecycle 
    // for instance: C.get().equals(myString) 
    public static String get(){ 
     return p.get(); 
    } 

    // remember to remove property from the thread when you're done, specially if it came from a thread pool 
    public static void remove(){ 
     p.remove(); 
    } 
}