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
cevap
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
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() ...
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.
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();
}
}
- 1. Kullanım
- 2. Kullanım
- 3. Kullanım modelinde kullanım amacını nasıl açıklayabiliriz?
- 4. Kullanım amaçlı JavaScript Kullanım Tablosu Tuşa basın
- 5. Kullanım jQuery
- 6. Tek kullanım
- 7. Kullanım yansıması
- 8. Kullanım EntityManager
- 9. Kullanım JPEG
- 10. Kullanım FileSystemWatcher
- 11. Kullanım AppRTC
- 12. Kullanım dönüştürücü
- 13. uygun kullanım
- 14. Kullanım jquery
- 15. Doğru kullanım Dispatcher.CheckAccess (veya atanmamış-kullanım)() Win yılında
- 16. CreateProcessWithTokenW - C# kullanım örneği
- 17. açıklanması ve kullanım JSONP
- 18. C++ zincirleme :: kullanım
- 19. Ağır kullanım ViewBag
- 20. Kullanım Süresi doldu TestFlight
- 21. Kullanım Döngülü başvuru
- 22. Kısa açıklama kullanım python'da
- 23. Kullanım insertBefore() duplicacy
- 24. Kullanım dış parametreleri - ServiceStack
- 25. Webpack Gelişmiş kullanım
- 26. Kullanım BeautifulSoup iki düğüm
- 27. Kullanım sonucu (postgres 8.3)
- 28. Kullanım SQL'de LINQ içeriyor
- 29. ThreadPool.QueueUserWorkItem kullanım durumu
- 30. Netbeans'de kullanım nesli
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