Java Concurrency - Giao diện ConcurrentMap

Giao diện java.util.concurrent.ConcurrentMap là giao diện con của giao diện Bản đồ, hỗ trợ các hoạt động nguyên tử trên biến bản đồ bên dưới. Nó có các phương thức get và set hoạt động như đọc và ghi trên các biến dễ bay hơi. Nghĩa là, một tập hợp có mối quan hệ xảy ra trước với bất kỳ lần nhận nào tiếp theo trên cùng một biến. Giao diện này đảm bảo an toàn luồng và đảm bảo tính nguyên tử.

Phương thức ConcurrentMap

Sr.No. Phương pháp & Mô tả
1

default V compute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction)

Cố gắng tính toán ánh xạ cho khóa được chỉ định và giá trị được ánh xạ hiện tại của nó (hoặc null nếu không có ánh xạ hiện tại).

2

default V computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction)

Nếu khóa được chỉ định chưa được liên kết với một giá trị (hoặc được ánh xạ thành null), hãy cố gắng tính toán giá trị của nó bằng cách sử dụng hàm ánh xạ đã cho và nhập nó vào bản đồ này trừ khi null.

3

default V computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction)

Nếu giá trị cho khóa được chỉ định có mặt và không rỗng, hãy cố gắng tính ánh xạ mới cho khóa và giá trị được ánh xạ hiện tại của nó.

4

default void forEach(BiConsumer<? super K,? super V> action)

Thực hiện hành động đã cho cho từng mục nhập trong bản đồ này cho đến khi tất cả mục nhập đã được xử lý hoặc hành động ném ra một ngoại lệ.

5

default V getOrDefault(Object key, V defaultValue)

Trả về giá trị mà khóa đã chỉ định được ánh xạ hoặc defaultValue nếu bản đồ này không chứa ánh xạ cho khóa.

6

default V merge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction)

Nếu khóa được chỉ định chưa được liên kết với một giá trị hoặc được liên kết với null, hãy liên kết nó với giá trị không null đã cho.

7

V putIfAbsent(K key, V value)

Nếu khóa được chỉ định chưa được liên kết với một giá trị, hãy liên kết nó với giá trị đã cho.

số 8

boolean remove(Object key, Object value)

Chỉ xóa mục nhập cho một khóa nếu hiện được ánh xạ tới một giá trị nhất định.

9

V replace(K key, V value)

Chỉ thay thế mục nhập cho một khóa nếu hiện được ánh xạ tới một giá trị nào đó.

10

boolean replace(K key, V oldValue, V newValue)

Chỉ thay thế mục nhập cho một khóa nếu hiện được ánh xạ tới một giá trị nhất định.

11

default void replaceAll(BiFunction<? super K,? super V,? extends V> function)

Thay thế giá trị của mỗi mục nhập bằng kết quả của việc gọi hàm đã cho trên mục nhập đó cho đến khi tất cả các mục nhập đã được xử lý hoặc hàm ném ra một ngoại lệ.

Thí dụ

Chương trình TestThread sau đây cho thấy cách sử dụng ConcurrentMap và HashMap.

import java.util.ConcurrentModificationException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class TestThread {

   public static void main(final String[] arguments) {
      Map<String,String> map = new ConcurrentHashMap<String, String>();

      map.put("1", "One");
      map.put("2", "Two");
      map.put("3", "Three");
      map.put("5", "Five");
      map.put("6", "Six");

      System.out.println("Initial ConcurrentHashMap: " + map);
      Iterator<String> iterator = map.keySet().iterator();

      try { 
         
         while(iterator.hasNext()) {
            String key = iterator.next();
            
            if(key.equals("3")) {
               map.put("4", "Four");
            }
         }
      } catch(ConcurrentModificationException cme) {
         cme.printStackTrace();
      }
      System.out.println("ConcurrentHashMap after modification: " + map);

      map = new HashMap<String, String>();

      map.put("1", "One");
      map.put("2", "Two");
      map.put("3", "Three");
      map.put("5", "Five");
      map.put("6", "Six");

      System.out.println("Initial HashMap: " + map);
      iterator = map.keySet().iterator();

      try {
         
         while(iterator.hasNext()) {
            String key = iterator.next();
            
            if(key.equals("3")) {
               map.put("4", "Four");
            }
         }
         System.out.println("HashMap after modification: " + map);
      } catch(ConcurrentModificationException cme) {
         cme.printStackTrace();
      }
   }  
}

Điều này sẽ tạo ra kết quả sau.

Đầu ra

Initial ConcurrentHashMap: {1 = One, 2 = Two, 3 = Three, 5 = Five, 6 = Six}
ConcurrentHashMap after modification: {1 = One, 2 = Two, 3 = Three, 4 = Four, 5 = Five, 6 = Six}
Initial HashMap: {1 = One, 2 = Two, 3 = Three, 5 = Five, 6 = Six}
java.util.ConcurrentModificationException
	at java.util.HashMap$HashIterator.nextNode(Unknown Source)
	at java.util.HashMap$KeyIterator.next(Unknown Source)
	at TestThread.main(TestThread.java:48)