Làm thế nào để triển khai tốt nhất bản đồ băm đồng thời trong Java?



Bài viết này sẽ giới thiệu cho bạn một khái niệm được gọi là Bản đồ băm đồng thời trong Java và theo dõi nó bằng một minh chứng thực tế

Bài viết này sẽ giới thiệu cho bạn một khái niệm được gọi là Bản đồ băm đồng thời Trong và theo dõi nó bằng một minh chứng thực tế. Các con trỏ theo dõi sẽ được đề cập trong bài viết này,

Tiếp tục với bài viết này về Bản đồ băm đồng thời trong Java





ConcurrentHashMap hoạt động nội bộ như thế nào?

Từ Java 5 trở đi ConcurrentHashMap được giới thiệu như một giải pháp thay thế cho HashTable. Chúng ta cũng có thể nhận được một bản đồ được đồng bộ hóa bằng cách sử dụng phương thức lớp tiện ích được gọi là syncMap () nhưng có một nhược điểm của phương pháp này là hiệu suất rất kém vì chỉ một luồng duy nhất có thể truy cập nó cùng một lúc. Vì vậy, ConcurrentHashMap giải quyết những vấn đề này.



Tiếp tục với bài viết này về Bản đồ băm đồng thời trong Java

Tại sao Bản đồ khác?

Mặc dù chúng ta đã có HashMap, HashTable thì ConcurrentHashMap vẫn cần là gì, đó là vì nó cung cấp hiệu suất tốt hơn đồng thời an toàn cho luồng.

Tiếp tục với bài viết này về Bản đồ băm đồng thời trong Java



Nó khác nhau như thế nào?

Nó cũng dựa trên băm nhưng hiệu suất của nó được cải thiện nhờ chiến lược khóa của nó. Không giống như HashTable hoặc HashMap được đồng bộ hóa, nó không áp dụng cùng một khóa trên mỗi phương thức mà nó sử dụng một khóa riêng biệt cho từng phương pháp, Nó sử dụng khóa đăng nhập lại cho mục đích này. Tương tự như HashMap, ConcurrentHashMap có 16 nhóm, tức là các phân đoạn, để tạo ConcurrentHashMap với hơn 16 nhóm, nó có các hàm tạo khác nhau.

công nghệ mới nhất trong trí tuệ nhân tạo

Trước khi nói chi tiết, chúng ta hãy xem xét một vài khái niệm dưới đây:

ConcurrentHashMap: Bản đồ này cho phép truy cập luồng đồng thời. Chỉ một phần của bản đồ được gọi là phân đoạn, tức là cấu trúc dữ liệu cơ bản bị khóa trong khi thêm hoặc cập nhật bản đồ. Nó cho phép truy cập luồng đồng thời để đọc dữ liệu mà không cần khóa. Nó được giới thiệu để cải thiện hiệu suất.

  • Mức đồng thời: Đây là một số là số lượng ước tính các chủ đề cập nhật đồng thời.
  • Load-Factor: Là một giá trị được sử dụng để kiểm soát hệ số thay đổi kích thước.
  • Dung lượng ban đầu: Là thuộc tính tạo ra Bản đồ với kích thước được cung cấp.

Hãy xem sơ đồ bên dưới và cố gắng hiểu cách ConcurrentHashMap hoạt động.

Image- Hashmap đồng thời- Edureka

Vì vậy, trong sơ đồ trên, chúng ta có 16 khóa chỉ khóa một phần bản đồ được yêu cầu để các phương thức khác có thể được truy cập bởi các luồng khác nhau, do đó cải thiện hiệu suất.

Tương tự như HashMap, ConcurrentHashMap hoạt động theo cách tương tự, nó chứa 16 phân đoạn theo mặc định và lưu trữ phần tử bằng cách băm, vì vậy nếu các phần tử có cùng một hàm băm thì chúng được lưu trữ trên cùng một phân đoạn như được hiển thị trong sơ đồ trên với sự trợ giúp của danh sách liên kết.

Tiếp tục với bài viết này về Bản đồ băm đồng thời trong Java

Sự khác biệt giữa ConcurrentHashMap và HashMap

HashMap thuộc Bộ sưu tập trong khi ConcurrentHashMap thuộc Bộ sưu tập đồng thời tuy nhiên có nhiều điểm khác biệt khác giữa chúng.

  • ConcurrentHashMap mới làAn toàn luồng tức làđược đồng bộ hóa nhưng HashMap không được đồng bộ hóa.
  • ConcurrentHashMap có hiệu suất thấp vì nó được đồng bộ hóa vì đôi khi các luồng phải chờ nhưng HashMap có hiệu suất cao vì nó không được đồng bộ hóa và bất kỳ luồng nào cũng có thể truy cập đồng thời.
  • Chúng ta sẽ nhận được ConcurrentModificationException nếu hai luồng đang đồng thời cố gắng sửa đổi hoặc thêm nội dung của Object. Tuy nhiên, trong trường hợp của ConcurrentHashMap, chúng tôi sẽ không nhận được bất kỳ ngoại lệ nào khi thực hiện cùng một thao tác.

  • Giá trị rỗng được phép cho khóa và giá trị trong HashMap tuy nhiên, ConcurrentHashMap không cho phép giá trị null cho khóa và giá trị mà nó đã cố gắng thêm giá trị null, chúng tôi sẽ nhận được ngoại lệ, tức là NullPointerException.

  • HashMap được giới thiệu trong JDK 1.2 trong khi ConcurrentHashMap được giới thiệu trong JDK 1.5.

Như chúng ta đã thấy trước đó để có hiệu suất tốt hơn, nó bao gồm một mảng các nút dưới dạng nhóm bảng vốn là các phân đoạn bảng trước Java 8 .

Các nhóm được khởi tạo một cách lười biếng khi lần chèn đầu tiên được thực hiện. Mọi nhóm có thể được khóa độc lập bằng cách khóa nút đầu tiên của nhóm cũng không chặn hoạt động đọc.

So với HashMap, ConcurrentHashMap cung cấp thêm concurrencyLevel đối số để kiểm soát số luồng ước tính sẽ sử dụng.

Người xây dựng:

  1. ConcurrentHashMap m = new ConcurrentHashMap ()

    Một bản đồ trống mới được tạo với dung lượng ban đầu mặc định là 16, hệ số tải là 0,75 và mức đồng thời 16.

  2. ConcurrentHashMap m = new ConcurrentHashMap (int initialCapacity)
    Một bản đồ trống mới được tạo với dung lượng ban đầu được chỉ định, hệ số tải là 0,75 và mức đồng thời 16.

  3. ConcurrentHashMap m = new ConcurrentHashMap (int initialCapacity, float loadFactor)

    Một bản đồ trống mới được tạo với công suất và hệ số tải ban đầu được chỉ định với mức đồng thời 16.

  4. ConcurrentHashMap m = new ConcurrentHashMap (int initialCapacity, float loadFactor, int concurrencyLevel)
    Một bản đồ trống mới được tạo với dung lượng ban đầu được chỉ định, hệ số tải và mức đồng thời.

  5. ConcurrentHashMap m = new ConcurrentHashMap (Bản đồ m)
    Tạo Bản đồ đồng thời mới từ bản đồ được cung cấp.

Hai đối số khác: InitialCapacity và loadFactor hoạt động khá giống với HashMap.
ConcurrentMap là bộ nhớ nhất quán trên các thao tác khóa / giá trị trong môi trường đa luồng.

Tiếp tục với bài viết này về Bản đồ băm đồng thời trong Java

Cạm bẫy

Trong khi truy xuất các đối tượng, ConcurrentHashMap không bị chặn và có thể chồng chéo với các hoạt động cập nhật, do đó để có hiệu suất tốt hơn, chúng chỉ truy xuất các hoạt động cập nhật đã hoàn thành gần đây nhất.

Kết quả của các phương pháp trạng thái tổng hợp bao gồm size, isEmpty và containsValue thường chỉ hữu ích khi bản đồ không được cập nhật đồng thời trong các chuỗi khác.

Nếu các cập nhật đồng thời được kiểm soát đúng cách, các phương thức trạng thái này có thể đáng tin cậy.

Mặc dù các phương pháp này không đảm bảo trong thời gian thực.

một hàm tạo có thể là riêng tư không

Dung lượng bảng mặc định là 16 tuy nhiên chúng ta có thể thay đổi nó bằng cách sử dụng mức đồng thời.

public ConcurrentHashMap (int initialCapacity, float loadFactor, int concurrencyLevel) {// ... if (initialCapacity

Nếu các khóa phím được yêu cầu sắp xếp theo thứ tự, chúng ta có thể sử dụng ConcurrentSkipListMap.

Bây giờ sau khi thực hiện chương trình trên, bạn sẽ hiểu được Bản đồ băm đồng thời trong Java. Vì vậy, chúng ta đã kết thúc bài viết này về Nếu bạn muốn tìm hiểu thêm, hãy xem , một công ty học trực tuyến đáng tin cậy. Khóa đào tạo và cấp chứng chỉ Java J2EE và SOA của Edureka được thiết kế để đào tạo bạn về cả khái niệm Java cốt lõi và nâng cao cùng với các khung công tác Java khác nhau như Hibernate & Spring.

Có một câu hỏi cho chúng tôi? Vui lòng đề cập đến vấn đề này trong phần bình luận của bài viết này và chúng tôi sẽ liên hệ lại với bạn trong thời gian sớm nhất.