ConcurrentHashMap trong Java: Tính năng và ứng dụng thực tế
3 phút đọc18/09/2025
Về tác giả
I have over 5 years of experience writing technical documentation for tech products, making them accessible and user-friendly. My focus is always on providing clear and precise information.
@#@
Tôi đã có hơn 5 năm kinh nghiệm viết tài liệu kỹ thuật cho các sản phẩm công nghệ, giúp người dùng dễ dàng tiếp cận và sử dụng. Tôi luôn tập trung vào việc cung cấp thông tin chính xác và dễ hiểu.
Cập nhật thông tin mới nhấtNhận các thông tin mới nhất về mối đe dọa, báo cáo an ninh mạng từ CyStack về hòm thư điện tử của bạn
{"success":true,"head":"<title>ConcurrentHashMap trong Java: Tính năng và ứng dụng thực tế - CyStack Tutorial</title>\n<meta name=\"description\" content=\"Đọc bài viết này để biết cách sử dụng ConcurrentHashMap nhằm cập nhật dữ liệu trong map đang được duyệt mà không bị vướng các lỗi như ConcurrentModificationException.\"/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-video-preview:-1, max-image-preview:large\"/>\n<link rel=\"canonical\" href=\"https://blog.cystack.org/tutorial/vi/2025/09/18/concurrenthashmap-trong-java/\" />\n<meta property=\"og:locale\" content=\"en_US\" />\n<meta property=\"og:type\" content=\"article\" />\n<meta property=\"og:title\" content=\"ConcurrentHashMap trong Java: Tính năng và ứng dụng thực tế - CyStack Tutorial\" />\n<meta property=\"og:description\" content=\"Đọc bài viết này để biết cách sử dụng ConcurrentHashMap nhằm cập nhật dữ liệu trong map đang được duyệt mà không bị vướng các lỗi như ConcurrentModificationException.\" />\n<meta property=\"og:url\" content=\"https://blog.cystack.org/tutorial/vi/2025/09/18/concurrenthashmap-trong-java/\" />\n<meta property=\"og:site_name\" content=\"CyStack Tutorial\" />\n<meta property=\"article:tag\" content=\"vi\" />\n<meta property=\"article:section\" content=\"Java\" />\n<meta property=\"og:updated_time\" content=\"2026-08-03T17:18:51+07:00\" />\n<meta property=\"og:image\" content=\"https://s2.cystack.net/tutorial/11164306/concurrenthashmap-trong-java.jpg\" />\n<meta property=\"og:image:secure_url\" content=\"https://s2.cystack.net/tutorial/11164306/concurrenthashmap-trong-java.jpg\" />\n<meta property=\"og:image:width\" content=\"1200\" />\n<meta property=\"og:image:height\" content=\"630\" />\n<meta property=\"og:image:alt\" content=\"ConcurrentHashMap trong Java\" />\n<meta property=\"og:image:type\" content=\"image/jpeg\" />\n<meta property=\"article:published_time\" content=\"2025-09-18T07:42:42+07:00\" />\n<meta property=\"article:modified_time\" content=\"2026-08-03T17:18:51+07:00\" />\n<meta name=\"twitter:card\" content=\"summary_large_image\" />\n<meta name=\"twitter:title\" content=\"ConcurrentHashMap trong Java: Tính năng và ứng dụng thực tế - CyStack Tutorial\" />\n<meta name=\"twitter:description\" content=\"Đọc bài viết này để biết cách sử dụng ConcurrentHashMap nhằm cập nhật dữ liệu trong map đang được duyệt mà không bị vướng các lỗi như ConcurrentModificationException.\" />\n<meta name=\"twitter:image\" content=\"https://s2.cystack.net/tutorial/11164306/concurrenthashmap-trong-java.jpg\" />\n<meta name=\"twitter:label1\" content=\"Written by\" />\n<meta name=\"twitter:data1\" content=\"Chris Pham\" />\n<meta name=\"twitter:label2\" content=\"Time to read\" />\n<meta name=\"twitter:data2\" content=\"4 minutes\" />\n<script type=\"application/ld+json\" class=\"rank-math-schema\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https://blog.cystack.org/tutorial/#person\",\"name\":\"CyStack Tutorial\"},{\"@type\":\"WebSite\",\"@id\":\"https://blog.cystack.org/tutorial/#website\",\"url\":\"https://blog.cystack.org/tutorial\",\"name\":\"CyStack Tutorial\",\"publisher\":{\"@id\":\"https://blog.cystack.org/tutorial/#person\"},\"inLanguage\":\"en-US\"},{\"@type\":\"ImageObject\",\"@id\":\"https://s2.cystack.net/tutorial/11164306/concurrenthashmap-trong-java.jpg\",\"url\":\"https://s2.cystack.net/tutorial/11164306/concurrenthashmap-trong-java.jpg\",\"width\":\"1200\",\"height\":\"630\",\"caption\":\"ConcurrentHashMap trong Java\",\"inLanguage\":\"en-US\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/09/18/concurrenthashmap-trong-java/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":\"1\",\"item\":{\"@id\":\"https://blog.cystack.org/tutorial\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"position\":\"2\",\"item\":{\"@id\":\"https://blog.cystack.org/tutorial/vi/category/java/\",\"name\":\"Java\"}},{\"@type\":\"ListItem\",\"position\":\"3\",\"item\":{\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/09/18/concurrenthashmap-trong-java/\",\"name\":\"ConcurrentHashMap trong Java: T\\u00ednh n\\u0103ng v\\u00e0 \\u1ee9ng d\\u1ee5ng th\\u1ef1c t\\u1ebf\"}}]},{\"@type\":\"WebPage\",\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/09/18/concurrenthashmap-trong-java/#webpage\",\"url\":\"https://blog.cystack.org/tutorial/vi/2025/09/18/concurrenthashmap-trong-java/\",\"name\":\"ConcurrentHashMap trong Java: T\\u00ednh n\\u0103ng v\\u00e0 \\u1ee9ng d\\u1ee5ng th\\u1ef1c t\\u1ebf - CyStack Tutorial\",\"datePublished\":\"2025-09-18T07:42:42+07:00\",\"dateModified\":\"2026-08-03T17:18:51+07:00\",\"isPartOf\":{\"@id\":\"https://blog.cystack.org/tutorial/#website\"},\"primaryImageOfPage\":{\"@id\":\"https://s2.cystack.net/tutorial/11164306/concurrenthashmap-trong-java.jpg\"},\"inLanguage\":\"en-US\",\"breadcrumb\":{\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/09/18/concurrenthashmap-trong-java/#breadcrumb\"}},{\"@type\":\"Person\",\"@id\":\"https://blog.cystack.org/tutorial/author/codeweaver/\",\"name\":\"Chris Pham\",\"url\":\"https://blog.cystack.org/tutorial/author/codeweaver/\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https://secure.gravatar.com/avatar/7a3584c941fa360ac061b2a8f15684ced7b92daa1f09481be135a684d989e9b9?s=96&d=mm&r=g\",\"url\":\"https://secure.gravatar.com/avatar/7a3584c941fa360ac061b2a8f15684ced7b92daa1f09481be135a684d989e9b9?s=96&d=mm&r=g\",\"caption\":\"Chris Pham\",\"inLanguage\":\"en-US\"}},{\"@type\":\"BlogPosting\",\"headline\":\"ConcurrentHashMap trong Java: T\\u00ednh n\\u0103ng v\\u00e0 \\u1ee9ng d\\u1ee5ng th\\u1ef1c t\\u1ebf - CyStack Tutorial\",\"keywords\":\"ConcurrentHashMap\",\"datePublished\":\"2025-09-18T07:42:42+07:00\",\"dateModified\":\"2026-08-03T17:18:51+07:00\",\"articleSection\":\"Java\",\"author\":{\"@id\":\"https://blog.cystack.org/tutorial/author/codeweaver/\",\"name\":\"Chris Pham\"},\"publisher\":{\"@id\":\"https://blog.cystack.org/tutorial/#person\"},\"description\":\"\\u0110\\u1ecdc b\\u00e0i vi\\u1ebft n\\u00e0y \\u0111\\u1ec3 bi\\u1ebft c\\u00e1ch s\\u1eed d\\u1ee5ng ConcurrentHashMap nh\\u1eb1m c\\u1eadp nh\\u1eadt d\\u1eef li\\u1ec7u trong map \\u0111ang \\u0111\\u01b0\\u1ee3c duy\\u1ec7t m\\u00e0 kh\\u00f4ng b\\u1ecb v\\u01b0\\u1edbng c\\u00e1c l\\u1ed7i nh\\u01b0 ConcurrentModificationException.\",\"name\":\"ConcurrentHashMap trong Java: T\\u00ednh n\\u0103ng v\\u00e0 \\u1ee9ng d\\u1ee5ng th\\u1ef1c t\\u1ebf - CyStack Tutorial\",\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/09/18/concurrenthashmap-trong-java/#richSnippet\",\"isPartOf\":{\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/09/18/concurrenthashmap-trong-java/#webpage\"},\"image\":{\"@id\":\"https://s2.cystack.net/tutorial/11164306/concurrenthashmap-trong-java.jpg\"},\"inLanguage\":\"en-US\",\"mainEntityOfPage\":{\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/09/18/concurrenthashmap-trong-java/#webpage\"}}]}</script>\n"}
ConcurrentHashMap trong Java là một class trong Concurrency Collection. Nó là một triển khai của hash table (bảng băm), hỗ trợ truy xuất và cập nhật đồng thời. ConcurrentHashMap được dùng trong môi trường đa luồng để tránh lỗi ConcurrentModificationException.

ConcurrentHashMap
Nếu ta cố gắng chỉnh sửa một collection trong khi đang duyệt qua nó, ta sẽ gặp lỗi ConcurrentModificationException. Java 1.5 đã bổ sung các class Concurrent trong gói java.util.concurrent để giải quyết vấn đề này.
ConcurrentHashMap là một triển khai của Map, cho phép chúng ta chỉnh sửa Map ngay cả trong lúc duyệt nó. Các thao tác trên ConcurrentHashMap đều có tính an toàn luồng. ConcurrentHashMap không cho phép key và value có giá trị là null.
Ví dụ về ConcurrentHashMap trong Java
Class ConcurrentHashMap tương tự như HashMap, chỉ khác ở chỗ nó có tính an toàn luồng và cho phép chỉnh sửa collection ngay trong khi duyệt.
package com.journaldev.util;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class ConcurrentHashMapExample {
public static void main(String[] args) {
//ConcurrentHashMap
Map<String,String> myMap = new ConcurrentHashMap<String,String>();
myMap.put("1", "1");
myMap.put("2", "1");
myMap.put("3", "1");
myMap.put("4", "1");
myMap.put("5", "1");
myMap.put("6", "1");
System.out.println("ConcurrentHashMap before iterator: "+myMap);
Iterator<String> it = myMap.keySet().iterator();
while(it.hasNext()){
String key = it.next();
if(key.equals("3")) myMap.put(key+"new", "new3");
}
System.out.println("ConcurrentHashMap after iterator: "+myMap);
//HashMap
myMap = new HashMap<String,String>();
myMap.put("1", "1");
myMap.put("2", "1");
myMap.put("3", "1");
myMap.put("4", "1");
myMap.put("5", "1");
myMap.put("6", "1");
System.out.println("HashMap before iterator: "+myMap);
Iterator<String> it1 = myMap.keySet().iterator();
while(it1.hasNext()){
String key = it1.next();
if(key.equals("3")) myMap.put(key+"new", "new3");
}
System.out.println("HashMap after iterator: "+myMap);
}
}
Output:
ConcurrentHashMap before iterator: {1=1, 5=1, 6=1, 3=1, 4=1, 2=1}
ConcurrentHashMap after iterator: {1=1, 3new=new3, 5=1, 6=1, 3=1, 4=1, 2=1}
HashMap before iterator: {3=1, 2=1, 1=1, 6=1, 5=1, 4=1}
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:793)
at java.util.HashMap$KeyIterator.next(HashMap.java:828)
at com.test.ConcurrentHashMapExample.main(ConcurrentHashMapExample.java:44)
Ta có thể thấy rõ rằng ConcurrentHashMap xử lý được việc thêm phần tử mới vào map ngay trong khi duyệt, trong khi HashMap lại gây ra lỗi . Cùng xem kỹ stack trace (thông tin các hàm gọi bị lỗi). Lỗi này được gây ra bởi câu lệnh sau.
String key = it1.next();
Điều này có nghĩa là phần tử mới đã được thêm vào HashMap, nhưng iterator (bộ lặp) lại gặp lỗi. Thực tế, iterator trên các đối tượng Collection có cơ chế fail-fast, tức là bất kỳ thay đổi nào về cấu trúc hay số lượng phần tử của collection đều sẽ gây ra lỗi ngay lập tức.
Làm sao iterator biết collection đã bị chỉnh sửa?
Ta đã lấy ra một set các key từ HashMap rồi duyệt qua set đó. HashMap có chứa một biến dùng để đếm số lần collection bị chỉnh sửa. Iterator sẽ sử dụng biến này mỗi khi ta gọi phương thức next() của nó để lấy entry tiếp theo.
/**
* The number of times this HashMap has been structurally modified
* Structural modifications are those that change the number of mappings in
* the HashMap or otherwise modify its internal structure (e.g.,
* rehash). This field is used to make iterators on Collection-views of
* the HashMap fail-fast. (See ConcurrentModificationException).
*/
transient volatile int modCount;
Giờ hãy thay đổi code một chút để thoát khỏi vòng lặp của iterator ngay khi ta thêm một phần tử mới. Ta chỉ cần thêm một câu lệnh break ngay sau lệnh put.
if(key.equals("3")){
myMap.put(key+"new", "new3");
break;
}
Output với đoạn code trên như dưới:
ConcurrentHashMap before iterator: {1=1, 5=1, 6=1, 3=1, 4=1, 2=1}
ConcurrentHashMap after iterator: {1=1, 3new=new3, 5=1, 6=1, 3=1, 4=1, 2=1}
HashMap before iterator: {3=1, 2=1, 1=1, 6=1, 5=1, 4=1}
HashMap after iterator: {3=1, 2=1, 1=1, 3new=new3, 6=1, 5=1, 4=1}
Điều gì xảy ra nếu giá trị của key bị chỉnh sửa?
Sẽ ra sao nếu ta không thêm một phần tử mới mà chỉ cập nhật một cặp key-value đã tồn tại? Liệu chương trình có gây ra lỗi không**?** Hãy cùng thay đổi code trong chương trình gốc và xem thử kết quả.
//myMap.put(key+"new", "new3");
myMap.put(key, "new3");
Sẽ không có lỗi nào xảy ra, bởi vì dù collection đã bị chỉnh sửa, cấu trúc của nó vẫn được giữ nguyên.
Đọc thêm
Bạn có để ý các dấu ngoặc nhọn khi ta tạo đối tượng collection và iterator không? Chúng được gọi là generics, một tính năng rất mạnh mẽ trong việc kiểm tra kiểu (type-checking) tại lúc compile để loại bỏ lỗi ClassCastException tại lúc runtime.
Hãy tìm đọc các bài viết khác của chúng tôi để hiểu thêm về generics cũng như các câu hỏi phỏng vấn về Java Collection cũng như kiểu thiết kế Iterator trong Java.