2010-10-18 36 views
8

java'da ThreadLocal'in tipik kullanımı nedir? Biri ne zaman kullanıyor? Bu java docs makalesinden ayrıntıları uygulayamadım.Kullanım AlanlarıLokal

+2

olası yinelenen [nasıl bir ThreadLocal değişken ne zaman kullanmalıyım ve?] (http://stackoverflow.com/questions/817856/when-and-how-should-i-use-a-threadlocal- değişken) – YoK

cevap

4

Eğer parçacığı güvenli değildir, ancak (performans nedenleriyle) bunlara erişimi eşitlemek istemediğiniz nesneleri kullanmak istediğinizde mı. Daha fazla veya daha az, birden çok kez kullanmanız gereken nesne için bir erişimci yaratırsınız, böylece bu erişimci diyebilecek her iş parçacığının farklı ve kullanılmamış bir aygıt almasını sağlarsınız. Çok tipik bir kullanım, SimpleDateFormat öğesinin kullanılmasıdır; bu, iş parçacığı güvenliyse, örneğinizin aynı örneği yeniden kullanmak için statik olarak bildirileceği bir sınıftır. Dr. Dobbs: Using Thread-Local Variables In Java

4

Belki daha açıklayıcı bir örnek sizin için iyi olabilir:

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

Böyle durumlar uzak, UI uzak cephe çağrıları (çok katmanlı mimariler örneğin meydana İşte

nitelendirerek iyi bir makale Cephe uygulama katmanı, uygulama katmanı çağrıları alan katmanı, etki alanı katmanı kalıcılığı katmanları, ...). Eğer bu yöntemler() farklı sınıflara aitse, bu yöntemlerden daha fazla veri eklemek için iyi bir yol yoktur. kod, bu, örneğin açık-kapalı ilkeyi kırar. Bu sorunun çözümü ThreadLocal geçerli:

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

Sana bir akışı sırasında her yerde erişilebilir olması gereken bazı nesne varsa ve bu referansı geçmek istemiyorsanız en tipik ThreadLocal kullanım olduğunu söyleyebilirim tüm katmanlar üzerindeki nesne. Tekil desenli, ancak iş parçacığı gibi bir şey.

örnekler yakın akışının sonunda/taahhüt ve akışı sırasında her yerde kullanmak, Sen akışının başında onları bir yere açmak oturum vs. hazırda bekletme, DB bağlantısı vardır.

0

Akışınız, söz konusu AlexR gibi bir iş parçacığına bağlıysa, private static final ThreadLocal<T> p özelliğine sahip bir public final class C oluşturabilir ve erişim yöntemleri ekleyebilirsiniz. Daha sonra akışınız boyunca sırasıyla p.set(), p.remove() ve p.get() kullanabilirsiniz. arasında

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(); 
    } 
}