2008-11-12 24 views
5

Để tóm tắt lại cho những bậc thầy NET người có thể không biết Java API:.NET có thực thi từ điển tương đương với ConcurrentHashMap của Java không?

ConcurrentHashMap trong Java có phương pháp nguyên tử (tức là không cần khóa bên ngoài) cho các hoạt động sửa đổi Bản đồ thông thường như:

putIfAbsent(K key, V value) 
remove(Object key, Object value) 
replace(K key, V value) 

Nó cũng cho phép lặp qua bộ khóa mà không cần khóa (nó lấy bản sao khi bắt đầu lặp lại) và các hoạt động get() thường có thể được xen kẽ với các cuộc gọi đến put() mà không bị chặn (nó sử dụng phân chia khóa hạt mịn IIRC).

Dù sao, câu hỏi của tôi là: . NET có thực thi từ điển tương đương không?

Tôi đoán chung hơn, tôi muốn biết liệu .NET có tập hợp các thư viện thu thập an toàn chủ đề tổng quát hơn không. Hoặc các tiện ích đồng thời nói chung - tương đương với các thư viện Doug Lea 's java.util.concurrent.

+0

bạn có thực sự cần thẻ java ở đây không? –

+0

Georgy - bạn nói đúng - đó là một câu hỏi .net, không phải là câu hỏi Java. Đã xóa thẻ. – serg10

+0

Dự án của tôi http://concurrent.codeplex.com/ có một từ điển Phân đoạn, cho phép nhiều người đọc và nhà văn, và cho phép giao dịch trên các giá trị nhất định. Đó là rất nhiều trong phát triển mặc dù ... – Martin

Trả lời

2

Không phải là tôi biết. Điều gần nhất với những gì bạn đang tìm kiếm có lẽ sẽ là phương thức được đồng bộ hóa của Hashtable, nó trả về một trình bao bọc thread an toàn (loại) an toàn xung quanh Hashtable. Tuy nhiên, nó chỉ an toàn cho nhiều nhà văn hoặc nhiều độc giả. Nếu tôi nhớ lại chính xác, một hỗn hợp của các nhà văn và độc giả sẽ không được an toàn thread.

3

CHỈNH SỬA: Điều này được viết trước khi .NET 4 được phát hành, khi hiển nhiên là có ConcurrentDictionary. Tôi để nó ở đây như một tài liệu tham khảo cho những người cần .NET 3.5.

Tôi không biết bất kỳ số nào tương đương với ConcurrentHashMap.

Về các tiện ích đồng thời chung - .NET luôn cung cấp nhiều hơn một chút so với các khái niệm cơ bản mà Java sử dụng để cung cấp, theo số Mutex, ManualResetEvent, AutoResetEventReaderWriterLock; sau đó gần đây hơn (.NET 2.0) Semaphore và (.NET 3.5) ReaderWriterLockSlim - cũng như toàn bộ hồ bơi thread quá trình, tất nhiên.

Sự rung lên lớn hơn sẽ có trong .NET 4.0 khi Tiện ích song song đến - điều đó sẽ làm cho đồng thời nhiều hơn đơn giản hơn. Tương tự như vậy, Coordination and Concurrency Runtime cuối cùng cũng phá vỡ các xiềng xích của Microsoft Robotics Studio, mặc dù tôi không rõ chính xác nơi nó đang đứng đầu (cho dù đó là một phần của bản thân .NET hay một thư viện riêng).

+0

Tôi đã theo ấn tượng (từ blog MSDN công cộng) rằng nó đã được mệnh để là một phần cốt lõi của NET 4.0. –

+0

Cảm ơn bạn đã trả lời Jon. Phần mở rộng song song trông rất thú vị. Chỉ cần được rõ ràng - Tôi không trolling - đây không phải là một "Java có thư viện tốt hơn so với .net" rant. Chỉ là mới để. Net và quan tâm để xem những gì có sẵn ra khỏi hộp. – serg10

+0

Marc: CCR là một phần của .NET 4.0? Liên kết sẽ được hoan nghênh! Serg: Đừng lo lắng, tôi đã không làm theo cách đó :) –

2

Cá nhân, tôi thấy rằng có các phương pháp riêng lẻ được đồng bộ hóa thường không hữu ích như âm thanh.

Thông thường, bạn có thể muốn thực hiện "get" và "put" liên quan trong lần kế tiếp và nếu một chuỗi khác đang xem xét cùng giá trị bạn có cuộc đua chuỗi ngay lập tức. Tương tự như vậy (tùy thuộc vào kịch bản), bạn không muốn giá trị đọc của ai đó mà bạn đang làm việc.

Đối với một cách tiếp cận rộng rãi, chỉ cần sử dụng một bên ngoài Monitor (lock(...) thể làm việc tốt trong nhiều tình huống. Nó là đơn giản, trọng lượng nhẹ, và trừ khi bạn dưới nặng chủ đề tải, đầy đủ hơn.

Đối với các tình huống phức tạp hơn, những thứ như ReaderWriterLockSlim v.v ... linh hoạt hơn.Nhưng tôi bắt đầu đơn giản, và chỉ thay đổi mọi thứ nếu hồ sơ cho thấy có một vấn đề tranh chấp thực sự.

Như Jon lưu ý, với Tiện ích mở rộng song song có một loạt thiết bị đồng bộ hóa hiệu năng cao mới; từ những gì tôi có thể nhìn thấy (ví dụ here, herehere), đây là một phần của .NET 4.0

+1

Trong ConcurrentHashMap của Java, các phương thức nhận, thay thế, putIfAbsent, vv không được đồng bộ hóa. Họ sử dụng các thuật toán không chặn để hoạt động mà không bị khóa trong hầu hết các tình huống tải. Tôi sẽ xem xét ReaderWriterLockSlim - cảm ơn mẹo. – serg10

+0

Tôi sẽ không gọi chính xác chúng là "hiệu suất cao". :-) –

16

Các đến Net 4.0 có một lớp ConcurrentDictionary, nó có một phương pháp thuận tiện GetOrAdd.

public TValue GetOrAdd(
    TKey key, 
    Func<TKey, TValue> valueFactory 
) 

Rất hữu ích cho bộ đệm máy chủ toàn cầu.

+2

để lưu trữ toàn bộ máy chủ, có thể tốt hơn nếu sử dụng đối tượng 'MemoryCache', nếu không bạn có thể bị rò rỉ bộ nhớ nếu không loại bỏ các đối tượng được tham chiếu khỏi' ConcurrentDictionary' – Sebastian

+0

Hãy coi chừng valueFactory cho GetOrAdd có thể được thực thi nhiều lần và * * không phải là nguyên tử ** như đã được chứng minh [Ở đây] (http://ayende.com/blog/4802/concurrentdictionary-getoradd-may-call-the-valuefactory-method-more-than-once) và [Here] (http : //geekswithblogs.net/BlackRabbitCoder/archive/2011/02/17/c.net-little-wonders-the-concurrentdictionary.aspx) – Anastasiosyal

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