2012-08-27 24 views

Trả lời

4

Tôi không hiểu, tại sao tab mới cần xóa.

Nó không phải là một bảng mới ... nó chỉ là một biến địa phương.

tôi có thể nghĩ ra ba lý do có thể:

  • Độ khó, theo đề nghị của @Bhesh Gurung ... mặc dù nó hầu như không tạo sự khác biệt ở đây (IMO).

  • Nó có thể giảm thiểu (phần nào) thiệt hại gây ra nếu một sợi gọi clear() trong khi luồng thứ hai thực hiện cập nhật có thể làm cho bảng được mở rộng. Nhưng nó chắc chắn không khắc phục được vấn đề, vì vậy tôi sẽ có khuynh hướng loại bỏ điều này như là vô nghĩa.

  • Nó có thể cải thiện hiệu suất; ví dụ. vì trình tối ưu hóa biết rằng tham chiếu trong biến cục bộ tab không thể thay đổi, nó có thể tối ưu hóa các giới hạn mảng kiểm tra tốt hơn.

Trong số này, tôi nghĩ rằng lý do thứ 3 là hợp lý nhất.

(Tôi không nghĩ rằng đó là bất cứ điều gì để làm với các modifier transient. Trong trường hợp này, các sửa đổi là chỉ có cho dễ đọc. Lớp HashMap cung cấp readObjectwriteObject đó ám chỉ rằng tranh luận transient sửa đổi.)

2

Có thể là do trường table được khai báo là transient, do đó nó không phải là một phần của trạng thái liên tục của đối tượng HashMap. Trường table được thay thế bằng các phương thức như resize(), không được đồng bộ hóa, vì vậy có thể có trường table được hoán đổi từ bên dưới bạn khi lặp qua tất cả các mục nhập bên trong cuộc gọi phương thức clear(). Nếu trước tiên nó tham chiếu đến table và lặp lại thông qua tham chiếu đó, chúng tôi được đảm bảo rằng nếu thay đổi trường table, chúng tôi vẫn đang lặp lại thông qua table ban đầu.

+0

Nhưng sau đó một lần nữa một 'HashMap' không phải là thread-an toàn trong các hoạt động" bình thường ", vậy tại sao nó sẽ quan tâm đến nó trong' clear() '? –

+0

@JoachimSauer Nếu bạn thêm nhiều mục trong một chuỗi, nó sẽ gọi 'resize()', ngay sau khi một chuỗi khác gọi 'clear()'. Việc này đảm bảo rằng lệnh 'clear()' đặt tất cả các mục cũ thành null, trong khi 'bảng' mới đang được tạo. Nếu không, trong trường hợp xấu nhất, tôi có thể kết thúc với một HashMap của tất cả các null, ngoại trừ cho mục tôi vừa thêm vào. –

+0

Tôi hiểu sự an toàn của chủ đề tốt là gì. Nhưng những gì tôi nói: 'put' một mình không phải là thread-safe (những điều khó chịu có thể xảy ra nếu nhiều chủ đề gọi nó). Vậy tại sao họ lại quan tâm nếu một phương pháp khác là an toàn luồng? –

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