2011-09-13 41 views
7

Đã một thời gian kể từ khi tôi sử dụng hashtable cho bất cứ điều gì quan trọng, nhưng tôi dường như nhớ lại các phương thức get() và put() đang được đồng bộ hóa.Chủ đề java.util.Hashtable có an toàn không?

JavaDocs không phản ánh điều này. Họ chỉ đơn giản nói rằng lớp Hashtable được đồng bộ hóa. Tôi có thể giả định điều gì? Nếu một số chủ đề truy cập vào hashtable cùng một lúc (giả sử họ không sửa đổi cùng một mục), các hoạt động sẽ thành công, phải không? Tôi đoán những gì tôi hỏi là "thread java.util.Hashtable có an toàn không?"

Hãy Hướng dẫn tôi để thoát khỏi vấn đề này ...

+0

http://download.oracle.com/javase/7/docs/api/java/util/Hashtable.html –

+1

Trích từ liên kết ở trên - Không giống như việc triển khai bộ sưu tập mới, Hashtable được đồng bộ . Nếu không cần thực thi an toàn chỉ, bạn nên sử dụng HashMap thay cho Hashtable. Nếu bạn muốn triển khai đồng thời nhiều luồng an toàn, thì nên sử dụng ConcurrentHashMap thay cho Hashtable. –

Trả lời

11

Đó là threadsafe vì nhận được, đặt, chứa các phương pháp vv được đồng bộ hóa. Hơn nữa, một số chủ đề sẽ không thể truy cập vào hashtable cùng một lúc, bất kể các mục mà họ đang sửa đổi.

chỉnh sửa - sửa đổi để bao gồm các biện pháp đồng bộ hóa làm cho chủ đề nội bộ có thể bắt đầu trong đó được sửa đổi nguyên tử; nó không bảo vệ chống lại điều kiện chủng tộc trong mã bên ngoài gây ra bởi đồng thời truy cập vào hashtable bởi nhiều chủ đề.

+5

nhưng bạn cần phải nhận thức được những cạm bẫy; trong khi các phương thức riêng lẻ là luồng an toàn, một thao tác tổng hợp (như kiểm tra nếu một mục không tồn tại và sau đó thêm nó; một ví dụ khác sẽ thay thế một phần tử cũ với một phần tử mới) thì không. Trong ngắn hạn hai hoạt động liên tiếp có thể dẫn đến vấn đề an toàn luồng và do đó ConcurrentHashMap nên được khám phá như là một thay thế. – Scorpion

+0

Tôi đồng ý với bạn và những người khác đã chỉ ra điều này; tất cả các đồng bộ hóa là thay đổi giới hạn cho một luồng tại một thời điểm, kiểm tra xem kết quả là sane vẫn là lập trình viên. – mcfinnigan

-2

Vâng, Hashtable chủ đề an toàn, vì vậy chỉ một thread có thể truy cập một Hashtable bất cứ lúc nào

HashMap, ở phía bên kia, không phải là thread an toàn (và do đó 'nhanh hơn').

+0

Nhưng bạn có thể tạo HashMap được đồng bộ hóa. –

9

Để sử dụng chung, đó là chỉ an toàn.

Nhưng bạn phải hiểu rằng nó làm cho logic ứng dụng của bạn xung quanh nó an toàn chỉ. Ví dụ: xem xét thực hiện để đặt một giá trị trong bản đồ, nếu nó chưa có. Thành ngữ này được gọi là putIfAbsent. Khó khăn của nó để thực hiện điều này một cách an toàn thread sử dụng HashTable một mình. Tương tự cho thành ngữ thay thế (k, V, V).

Do đó cho thành ngữ nhất định như putIfAbsent và và replace (K, V, V), tôi sẽ khuyên bạn sử dụng ConcurrentHashMap

+1

bất kỳ ai quan tâm giải thích phiếu bầu xuống? –

1

số Nó được 'threadsafe' chỉ trong phạm vi mà phương thức của nó được đồng bộ hóa. Tuy nhiên nó không phải là threadafe nói chung, và nó không thể được, bởi vì các lớp học xuất khẩu trạng thái nội bộ như Iterators hoặc Enumerations yêu cầu sử dụng trạng thái nội bộ để được đồng bộ là tốt. Đó là lý do tại sao các lớp Bộ sưu tập mới là không phải là được đồng bộ hóa, vì các nhà thiết kế Java đã nhận ra rằng an toàn luồng là tùy thuộc vào người dùng của lớp, chứ không phải chính lớp đó.

+0

bạn có thể giải thích một chút câu trả lời của mình cho tôi không? – Saravanan

+2

@EJP, * một phần luồng an toàn * là sai. Hashtable ** là thread-safe ** và nó sử dụng 'Enumerator' và ** not **' Iterator'. –

+0

Không, nó không phải là chủ đề an toàn, vì lý do tôi đưa ra, và tôi đã nói 'như'. – EJP

1

Lưu ý rằng rất nhiều câu trả lời cho biết rằng Hashtable được đồng bộ hóa. nhưng điều này sẽ cho bạn rất ít. Việc đồng bộ hóa trên các phương thức accessor/mutator sẽ ngăn chặn hai luồng thêm hoặc loại bỏ khỏi bản đồ đồng thời, nhưng trong thế giới thực, bạn sẽ thường cần đồng bộ hóa bổ sung.

Thậm chí lặp qua các mục nhập của Hashtable không phải là chủ đề an toàn trừ khi bạn cũng bảo vệ Bản đồ không bị sửa đổi thông qua đồng bộ hóa bổ sung.

3

Hashtable không được dùng nữa. Quên đi. Nếu bạn muốn sử dụng các bộ sưu tập đã đồng bộ, hãy sử dụng trình bao bọc Collections.syncrhonize *() cho mục đích đó. Nhưng những cái này không được khuyến cáo. Trong Java 5, 6 thuật toán đồng thời mới đã được thực hiện. Copy-on-write, CAS, thuật toán không khóa. Đối với giao diện Bản đồ, có hai triển khai đồng thời. ConcurrentHashMap (bản đồ băm đồng thời) và ConcurrentSkipListMap - đồng thời sắp xếp bản đồ implementaion.

Cái đầu tiên được tối ưu hóa để đọc, vì vậy các lần truy xuất không chặn ngay cả khi bảng đang được cập nhật. Viết cũng làm việc nhanh hơn nhiều so với các trình bao bọc đồng bộ gây ra một ConcurrentHashMap bao gồm không chỉ một mà là một tập hợp các bảng, được gọi là các phân đoạn. Nó có thể được quản lý bởi đối số cuối cùng trong constructor:

public ConcurrentHashMap(int initialCapacity, 
         float loadFactor, 
         int concurrencyLevel); 

ConcurrentHashMap là không thể thiếu trong bối cảnh giá cao đồng thời, nơi nó thực hiện tốt hơn nhiều so với bất kỳ thay thế có sẵn.

2

Tôi hỏi là "Có phải java.util.Hashtable thread safe?".

Có Hashtable là chủ đề an toàn, Nếu không an toàn chủ đề trong ứng dụng của bạn, hãy truy cập HashMap, Trong trường hợp, nếu bạn muốn thực hiện an toàn chỉ, thì nên sử dụng ConcurrentHashMap thay cho Hashtable .

0

Nếu bạn nhìn vào mã Hashtable, bạn sẽ thấy rằng phương pháp được đồng bộ như:

public synchronized V get(Object key) 
public synchronized V put(K key, V value) 
public synchronized boolean containsKey(Object key) 

Bạn có thể giữ cách nhấn vào phím điều khiển (lệnh cho mac) và sau đó nhấp vào bất kỳ tên phương pháp trong nhật thực để đi đến mã nguồn java.

0

Không giống như triển khai bộ sưu tập mới, Hashtable được đồng bộ hóa. * Nếu không cần thực hiện an toàn chỉ, bạn nên sử dụng HashMap * thay cho Hashtable. Nếu yêu cầu thực hiện đồng thời an toàn theo luồng an toàn thì bạn nên sử dụng ConcurrentHashMap thay cho Hashtable.

http://download.oracle.com/javase/7/docs/api/java/util/Hashtable.html

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