2012-05-15 69 views
5

xác định một biến threadlocal trong một lớp để duy trì một số trường hợp. thiết lập và nhận được trong một phương pháp đệ quy. Có lẽ tôi không thể xóa biến threadlocal khi yêu cầu hoàn thành (tôi đã phân tích theo tất cả các cách khác. Tôi không thể xóa luồng chủ đề).Nếu không xóa biến ThreadLocal, Điều gì sẽ xảy ra?

Câu hỏi của tôi là, Nếu tôi không xóa biến chủ đề cho mỗi yêu cầu, điều gì sẽ xảy ra? Các tác động là gì?

Trả lời

2

Nếu chuỗi chết, tham chiếu đến mục ThreadLocal và vì vậy đối tượng của bạn (giả sử không có tham chiếu khác) sẽ bị thu gom rác.

Chừng nào chuỗi còn tồn tại, thì đối tượng của bạn cũng vậy.

Bạn phải đánh giá tác động của đối tượng của bạn là tồn tại lâu dài.

+0

Cảm ơn bohemian vì đã trả lời ur. Vì vậy, trong khi phục vụ một yêu cầu tiếp theo, tôi sẽ không nhận được các giá trị cũ từ threadlocal (của yêu cầu trước đó) .. rite? – Shahul

+0

vâng, tôi nghĩ bạn sẽ làm máy chủ có xu hướng sử dụng lại Chủ đề. – keuleJ

0

Bạn bị rò rỉ bộ nhớ và ThreadLocal có thể đã được đặt, lần sau mã của bạn được gọi. ThreadLocals là một chút của một mã imo mùi.

9

Các javadoc nói:

sau một sợi biến mất, tất cả các bản sao của thread-địa phương trường hợp này tùy thuộc vào thu gom rác thải (trừ khi tài liệu tham khảo khác để những bản tồn tại).

Ví dụ: the implementation đây được hỗ trợ bởi một HashTable sử dụng weak references cho khóa. Trong trường hợp này, khóa là chủ đề. Nếu chuỗi kết thúc, mục nhập trong bản đồ sẽ đủ điều kiện để thu thập rác.

Bộ gom rác chỉ có thể xảy ra khi hệ thống khởi động hết dung lượng bộ nhớ. Nhưng việc xem xét này áp dụng cho tất cả các đối tượng trong hệ thống: khi các đối tượng bắt đầu được khai hoang phụ thuộc vào chính sách GC, đó là VM specifc và có thể điều chỉnh.

Đây là quan điểm của tôi về việc sử dụng tốt và xấu của người dân địa phương chủ đề:

  • là tốt ot người dân địa phương sử dụng chủ đề nếu điểm là để giải quyết một vấn đề đồng thời. Ví dụ: tránh đồng bộ hóa an object that is not thread-safe by keeping one copy per thread. Hoặc để giải quyết vấn đề thiết kế khác liên quan đến đồng thời.

  • là xấu nếu điểm là "chuyển thông số" xuống chuỗi cuộc gọi theo cách rẻ tiền. Bạn nên refactor mã của bạn và vượt qua đối tượng xuống chuỗi cuộc gọi như một paramter phương pháp thường xuyên.

  • là ok để sử dụng chuỗi cục bộ để lưu trữ một số dạng ngữ cảnh "hiện tại", ví dụ: yêu cầu hiện tại.

Các vấn đề liên quan