AtomicInteger trong Java: Cách xử lý an toàn trong lập trình đa luồng
3 phút đọc23/10/2025
Về tác giả
I’m passionate about web development and sharing my insights through articles, with over 8 years of experience. I hope these sharings inspire you and help build a strong web development community.
@#@
Tôi đam mê phát triển web và chia sẻ những hiểu biết của mình thông qua các bài viết, với hơn 8 năm kinh nghiệm. Tôi hy vọng những chia sẻ này sẽ truyền cảm hứng cho các bạn và giúp xây dựng một cộng đồng phát triển web mạnh mẽ.
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>AtomicInteger trong Java: Cách xử lý an toàn trong lập trình đa luồng - CyStack Tutorial</title>\n<meta name=\"description\" content=\"Tìm hiểu AtomicInteger trong Java, cách hoạt động trong lập trình đa luồng, so sánh với synchronized và ví dụ minh họa dễ hiểu.\"/>\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/10/23/atomicinteger-trong-java-cach-xu-ly-an-toan-trong-lap-trinh-da-luong/\" />\n<meta property=\"og:locale\" content=\"en_US\" />\n<meta property=\"og:type\" content=\"article\" />\n<meta property=\"og:title\" content=\"AtomicInteger trong Java: Cách xử lý an toàn trong lập trình đa luồng - CyStack Tutorial\" />\n<meta property=\"og:description\" content=\"Tìm hiểu AtomicInteger trong Java, cách hoạt động trong lập trình đa luồng, so sánh với synchronized và ví dụ minh họa dễ hiểu.\" />\n<meta property=\"og:url\" content=\"https://blog.cystack.org/tutorial/vi/2025/10/23/atomicinteger-trong-java-cach-xu-ly-an-toan-trong-lap-trinh-da-luong/\" />\n<meta property=\"og:site_name\" content=\"CyStack Tutorial\" />\n<meta property=\"article:tag\" content=\"vi\" />\n<meta property=\"article:section\" content=\"Chuyên gia\" />\n<meta property=\"og:updated_time\" content=\"2026-08-03T17:52:30+07:00\" />\n<meta property=\"og:image\" content=\"https://s2.cystack.net/tutorial/24120257/atomicinteger-trong-java.jpg\" />\n<meta property=\"og:image:secure_url\" content=\"https://s2.cystack.net/tutorial/24120257/atomicinteger-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=\"AtomicInteger trong Java\" />\n<meta property=\"og:image:type\" content=\"image/jpeg\" />\n<meta property=\"article:published_time\" content=\"2025-10-23T10:12:57+07:00\" />\n<meta property=\"article:modified_time\" content=\"2026-08-03T17:52:30+07:00\" />\n<meta name=\"twitter:card\" content=\"summary_large_image\" />\n<meta name=\"twitter:title\" content=\"AtomicInteger trong Java: Cách xử lý an toàn trong lập trình đa luồng - CyStack Tutorial\" />\n<meta name=\"twitter:description\" content=\"Tìm hiểu AtomicInteger trong Java, cách hoạt động trong lập trình đa luồng, so sánh với synchronized và ví dụ minh họa dễ hiểu.\" />\n<meta name=\"twitter:image\" content=\"https://s2.cystack.net/tutorial/24120257/atomicinteger-trong-java.jpg\" />\n<meta name=\"twitter:label1\" content=\"Written by\" />\n<meta name=\"twitter:data1\" content=\"Bao Tran\" />\n<meta name=\"twitter:label2\" content=\"Time to read\" />\n<meta name=\"twitter:data2\" content=\"2 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/24120257/atomicinteger-trong-java.jpg\",\"url\":\"https://s2.cystack.net/tutorial/24120257/atomicinteger-trong-java.jpg\",\"width\":\"1200\",\"height\":\"630\",\"caption\":\"AtomicInteger trong Java\",\"inLanguage\":\"en-US\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/10/23/atomicinteger-trong-java-cach-xu-ly-an-toan-trong-lap-trinh-da-luong/#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/chuyen-gia/\",\"name\":\"Chuy\\u00ean gia\"}},{\"@type\":\"ListItem\",\"position\":\"3\",\"item\":{\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/10/23/atomicinteger-trong-java-cach-xu-ly-an-toan-trong-lap-trinh-da-luong/\",\"name\":\"AtomicInteger trong Java: C\\u00e1ch x\\u1eed l\\u00fd an to\\u00e0n trong l\\u1eadp tr\\u00ecnh \\u0111a lu\\u1ed3ng\"}}]},{\"@type\":\"WebPage\",\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/10/23/atomicinteger-trong-java-cach-xu-ly-an-toan-trong-lap-trinh-da-luong/#webpage\",\"url\":\"https://blog.cystack.org/tutorial/vi/2025/10/23/atomicinteger-trong-java-cach-xu-ly-an-toan-trong-lap-trinh-da-luong/\",\"name\":\"AtomicInteger trong Java: C\\u00e1ch x\\u1eed l\\u00fd an to\\u00e0n trong l\\u1eadp tr\\u00ecnh \\u0111a lu\\u1ed3ng - CyStack Tutorial\",\"datePublished\":\"2025-10-23T10:12:57+07:00\",\"dateModified\":\"2026-08-03T17:52:30+07:00\",\"isPartOf\":{\"@id\":\"https://blog.cystack.org/tutorial/#website\"},\"primaryImageOfPage\":{\"@id\":\"https://s2.cystack.net/tutorial/24120257/atomicinteger-trong-java.jpg\"},\"inLanguage\":\"en-US\",\"breadcrumb\":{\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/10/23/atomicinteger-trong-java-cach-xu-ly-an-toan-trong-lap-trinh-da-luong/#breadcrumb\"}},{\"@type\":\"Person\",\"@id\":\"https://blog.cystack.org/tutorial/author/baotran/\",\"name\":\"Bao Tran\",\"url\":\"https://blog.cystack.org/tutorial/author/baotran/\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https://secure.gravatar.com/avatar/0cdd33c02ec4a531fcf557b9c1ccc276df0c69031b2382c959bcf335248e840c?s=96&d=mm&r=g\",\"url\":\"https://secure.gravatar.com/avatar/0cdd33c02ec4a531fcf557b9c1ccc276df0c69031b2382c959bcf335248e840c?s=96&d=mm&r=g\",\"caption\":\"Bao Tran\",\"inLanguage\":\"en-US\"}},{\"@type\":\"BlogPosting\",\"headline\":\"AtomicInteger trong Java: C\\u00e1ch x\\u1eed l\\u00fd an to\\u00e0n trong l\\u1eadp tr\\u00ecnh \\u0111a lu\\u1ed3ng - CyStack Tutorial\",\"keywords\":\"AtomicInteger trong Java,Java AtomicInteger\",\"datePublished\":\"2025-10-23T10:12:57+07:00\",\"dateModified\":\"2026-08-03T17:52:30+07:00\",\"articleSection\":\"Chuy\\u00ean gia, Java\",\"author\":{\"@id\":\"https://blog.cystack.org/tutorial/author/baotran/\",\"name\":\"Bao Tran\"},\"publisher\":{\"@id\":\"https://blog.cystack.org/tutorial/#person\"},\"description\":\"T\\u00ecm hi\\u1ec3u AtomicInteger trong Java, c\\u00e1ch ho\\u1ea1t \\u0111\\u1ed9ng trong l\\u1eadp tr\\u00ecnh \\u0111a lu\\u1ed3ng, so s\\u00e1nh v\\u1edbi synchronized v\\u00e0 v\\u00ed d\\u1ee5 minh h\\u1ecda d\\u1ec5 hi\\u1ec3u.\",\"name\":\"AtomicInteger trong Java: C\\u00e1ch x\\u1eed l\\u00fd an to\\u00e0n trong l\\u1eadp tr\\u00ecnh \\u0111a lu\\u1ed3ng - CyStack Tutorial\",\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/10/23/atomicinteger-trong-java-cach-xu-ly-an-toan-trong-lap-trinh-da-luong/#richSnippet\",\"isPartOf\":{\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/10/23/atomicinteger-trong-java-cach-xu-ly-an-toan-trong-lap-trinh-da-luong/#webpage\"},\"image\":{\"@id\":\"https://s2.cystack.net/tutorial/24120257/atomicinteger-trong-java.jpg\"},\"inLanguage\":\"en-US\",\"mainEntityOfPage\":{\"@id\":\"https://blog.cystack.org/tutorial/vi/2025/10/23/atomicinteger-trong-java-cach-xu-ly-an-toan-trong-lap-trinh-da-luong/#webpage\"}}]}</script>\n"}
Hôm nay chúng ta sẽ cùng tìm hiểu về AtomicInteger trong Java.

Các thao tác nguyên tử (atomic operations) được thực hiện trọn vẹn trong một đơn vị xử lý duy nhất, không bị gián đoạn hay can thiệp bởi bất kỳ thao tác nào khác.
Trong môi trường đa luồng, các thao tác nguyên tử là rất cần thiết để tránh xảy ra tình trạng dữ liệu không nhất quán*.*
AtomicInteger trong Java
Hãy cùng tạo một chương trình đa luồng đơn giản, trong đó mỗi luồng sẽ tăng một biến đếm dùng chung (count) lên 4 lần.
Vì vậy, nếu có hai luồng, sau khi cả hai hoàn tất, giá trị (count) nên là 8.
package com.journaldev.concurrency;
public class JavaAtomic {
public static void main(String[] args) throws InterruptedException {
ProcessingThread pt = new ProcessingThread();
Thread t1 = new Thread(pt, "t1");
t1.start();
Thread t2 = new Thread(pt, "t2");
t2.start();
t1.join();
t2.join();
System.out.println("Processing count=" + pt.getCount());
}
}
class ProcessingThread implements Runnable {
private int count;
@Override
public void run() {
for (int i = 1; i < 5; i++) {
processSomething(i);
count++;
}
}
public int getCount() {
return this.count;
}
private void processSomething(int i) {
// processing some job
try {
Thread.sleep(i * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Nếu bạn chạy chương trình ở trên, bạn sẽ nhận thấy rằng giá trị của count có thể dao động trong khoảng 5, 6, 7 hoặc 8. Lý do là bởi vì phép toán count++ không phải là một thao tác nguyên tử. Khi một luồng đọc giá trị hiện tại và chuẩn bị tăng lên 1, một luồng khác có thể đã đọc cùng một giá trị cũ, dẫn đến kết quả cuối cùng bị sai.
Cách giải quyết: Để khắc phục vấn đề này, chúng ta cần đảm bảo rằng phép tăng count là một thao tác nguyên tử.
Có thể làm điều này bằng cách dùng từ khóa synchronized, nhưng bắt đầu từ Java 5, gói java.util.concurrent.atomic đã cung cấp các lớp bao (wrapper classes) như AtomicInteger và AtomicLong, giúp thực hiện các thao tác nguyên tử mà không cần dùng synchronized.
Ví dụ về AtomicInteger trong Java
Dưới đây là phiên bản đã cập nhật của chương trình, sử dụng AtomicInteger phương thức incrementAndGet(), chương trình sẽ luôn xuất ra giá trị count cuối cùng là 8, vì mỗi lần tăng đều được xử lý nguyên tử, không có xung đột giữa các luồng.
package com.journaldev.concurrency;
import java.util.concurrent.atomic.AtomicInteger;
public class JavaAtomic {
public static void main(String[] args) throws InterruptedException {
ProcessingThread pt = new ProcessingThread();
Thread t1 = new Thread(pt, "t1");
t1.start();
Thread t2 = new Thread(pt, "t2");
t2.start();
t1.join();
t2.join();
System.out.println("Processing count=" + pt.getCount());
}
}
class ProcessingThread implements Runnable {
private AtomicInteger count = new AtomicInteger();
@Override
public void run() {
for (int i = 1; i < 5; i++) {
processSomething(i);
count.incrementAndGet();
}
}
public int getCount() {
return this.count.get();
}
private void processSomething(int i) {
// processing some job
try {
Thread.sleep(i * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Lợi ích của việc sử dụng các lớp đồng thời (concurrency classes) để thực hiện các thao tác nguyên tử là chúng ta không cần lo lắng về việc đồng bộ hóa (synchronization). Điều này giúp mã nguồn dễ đọc hơn và giảm khả năng xảy ra lỗi trong quá trình xử lý.
Bên cạnh đó, các lớp đồng thời hỗ trợ thao tác nguyên tử thường được đánh giá là hiệu quả hơn so với cơ chế đồng bộ hóa truyền thống, vốn đòi hỏi phải khóa và quản lý tài nguyên trong lúc thực thi.