2010-10-18 18 views
8

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

+2

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

Trả lời

4

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

4

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() ... 
5

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.

0

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(); 
    } 
} 
Các vấn đề liên quan