Cách sử dụng điển hình của ThreadLocal trong java là gì. Khi nào thì sử dụng nó? Tôi không thể áp dụng chi tiết từ bài viết java docs này.Sử dụng ThreadLocal
Trả lời
Dành cho thời điểm bạn muốn sử dụng các đối tượng không phải là chủ đề an toàn, nhưng không muốn đồng bộ hóa quyền truy cập vào chúng (vì lý do hiệu suất). Nhiều hơn hoặc ít hơn, bạn tạo một trình truy cập cho đối tượng bạn cần sử dụng nhiều lần, để đảm bảo rằng mọi chuỗi có thể gọi trình truy cập đó sẽ có một trình duyệt khác, không được sử dụng. Một cách sử dụng rất điển hình là sử dụng SimpleDateFormat, là một lớp nếu đó là luồng an toàn, cá thể của bạn sẽ được khai báo là tĩnh, để tái sử dụng cùng một cá thể.
Dưới đây là một bài viết tốt mô tả nó: Dr. Dobbs: Using Thread-Local Variables In Java
dụ lẽ minh họa hơn có thể tốt cho bạn:
method1(): ... method2(somedata) ...
method2(somedata): ... method3(somedata) ...
method3(somedata): ... method4(somedata) ...
method4(somedata): ... do something with somedata ...
tình huống như vậy xảy ra ví dụ như trong kiến trúc đa tầng (UI gọi mặt tiền xa xôi, hẻo lánh lớp ứng dụng gọi là lớp miền, lớp lớp gọi là lớp tồn tại, ...) Nếu các phương thức() thuộc về các lớp khác nhau thì không có cách nào tốt để truyền dữ liệu đó, ngoại trừ thêm tham số 'somedata' cho hầu hết các phương thức trong mã, điều này phá vỡ ví dụ như nguyên tắc đóng mở. Giải pháp cho vấn đề này là ThreadLocal:
method1(): ... threadLocal.set(somedata); method2(); threadLocal.set(null); ...
method2(): ... method3() ...
method3(): ... method4() ...
method4(): ... do something with threadLocal.get() ...
Tôi muốn nói rằng việc sử dụng ThreadLocal điển hình nhất là khi bạn có một số đối tượng mà đã có thể truy cập ở khắp mọi nơi trong một dòng chảy và bạn không muốn để vượt qua tham chiếu đến này đối tượng trên tất cả các lớp. Một cái gì đó giống như mô hình singleton nhưng mỗi thread.
Ví dụ là kết nối DB, phiên ngủ đông, v.v. Bạn mở chúng ở đâu đó vào đầu luồng, cam kết/đóng vào cuối luồng và sử dụng ở mọi nơi trong luồng.
Nếu luồng của bạn được gắn với một sợi, như AlexR đã đề cập, bạn có thể tạo public final class C
với thuộc tính private static final ThreadLocal<T> p
, thêm phương thức truy cập. Sau đó, bạn có thể sử dụng p.set(), p.remove() và p.get() tương ứng dọc theo luồng của bạn.
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. ngày chuyển đổi với ThreadLocal
- 2. Bạn có thể sử dụng ThreadLocal để lưu trữ ngôn ngữ được yêu cầu không?
- 3. Làm thế nào để sử dụng ThreadLocal giảm thể dùng lại
- 4. Biến ThreadLocal vs local trong Runnable
- 5. ThreadLocal trên Google App Engine (GAE)
- 6. Quản lý phiên bản ThreadLocal Hibernate tương thích với ForkJoinPool?
- 7. ThreadLocal <AtomicInteger> có thể hữu ích không?
- 8. ThreadLocal <> và rò rỉ bộ nhớ
- 9. ThreadLocal pondering (Hoặc: Mặt trời có phải là javadoc không?)
- 10. Nếu không xóa biến ThreadLocal, Điều gì sẽ xảy ra?
- 11. ThreadStatic v.s. ThreadLocal <T>: tốt hơn so với thuộc tính?
- 12. Có lợi ích nào khi đặt đối tượng ThreadSafe lên ThreadLocal không?
- 13. Làm cách nào để kết hợp các giá trị từ biến ThreadLocal <T>?
- 14. Cách sử dụng các cookie khác nhau cho mỗi kết nối bằng cách sử dụng HttpURLConnection và CookieManager trong Java
- 15. Lời khuyên về việc sử dụng ThreadLocals để bọc các đối tượng đơn lẻ có thể thay đổi
- 16. Sử dụng thời gian sử dụng jQuery
- 17. sử dụng muối khi sử dụng SimpleMembershipProvider
- 18. Có cách nào tốt để sử dụng lại các truy vấn Morphia?
- 19. Sử dụng lại trình quản lý thực thể bởi em.clear() hoặc tạo một trình quản lý đối tượng mới?
- 20. Cách sử dụng EF (khung pháp nhân) sử dụng câu lệnh "sử dụng"
- 21. MySQL không sử dụng chỉ mục ("Sử dụng filesort") khi sử dụng ORDER BY
- 22. Cách sử dụng 'sử dụng' hoặc 'sử dụng' bằng ngôn ngữ lập trình
- 23. Sử dụng Ngày Sử dụng Sqlalchemy trong Bộ lọc Sử dụng Postgresql
- 24. Sử dụng EJBCtext getContextData - điều này có an toàn không?
- 25. Sử dụng dịch vụ web bằng cách sử dụng Javascript
- 26. Sử dụng libtool mà không cần sử dụng liên kết
- 27. Android: Cách sử dụng "sử dụng thư viện"?
- 28. Để sử dụng OpenID hay không sử dụng?
- 29. cách sử dụng không sử dụng phiên tạo
- 30. Luôn sử dụng; không bao giờ sử dụng địa phương?
bản sao có thể có của [Khi nào và làm thế nào tôi nên sử dụng biến ThreadLocal?] (Http://stackoverflow.com/questions/817856/when-and-how-should-i-use-a-threadlocal- biến) – YoK