CodeGym
Khuyến mãi
Học tập
Khóa học
Bài tập
Khảo sát & Bài kiểm tra
Trò chơi
Trợ giúp
Lịch
Cộng đồng
Người dùng
Diễn đàn
Trò chuyện
Bài viết
Câu chuyện thành công
Hoạt động
Đánh giá
Gói đăng ký
Chủ đề sáng

Bài học

  • Đánh giá
  • Về chúng tôi
Bắt đầu
Bắt đầu học
Bắt đầu học ngay
  • Tiến độ của tôi
  • Khóa học
  • Bản đồ Quest
  • Bài học
  • Deadlock: nguyên nhân, ví dụ, cách khắc phục

    JAVA 25 SELF
    Cấp độ 53,Bài học 0
    Trong bài giảng này, chúng ta tìm hiểu khóa chéo giữa các luồng (deadlock) trong Java là gì, vì sao xảy ra và bốn điều kiện cần để nó xuất hiện. Với ví dụ thực tế dùng synchronized chúng ta tái hiện vấn đề, sau đó tìm hiểu các chiến lược phòng tránh: thống nhất thứ tự chiếm tài nguyên, sử dụng ReentrantLock.tryLock với timeout, rút gọn vùng tới hạn và tránh các khóa lồng nhau không cần thiết. Trình bày cách chẩn đoán qua Thread Dump và jstack, cách nhận diện trạng thái BLOCKED/ WAITING, và kết thúc bằng checklist cùng các lỗi điển hình.
    Có sẵn
  • Livelock và Starvation: định nghĩa và ví dụ

    JAVA 25 SELF
    Cấp độ 53,Bài học 1
    Phân tích các hiện tượng bất thường trong lập trình đồng thời Livelock và Starvation: chúng khác gì so với Deadlock, trông như thế nào trong mã và trong log. Có các ví dụ bằng Java: “những worker lịch sự” (khóa “sống” — livelock) và hiện tượng đói do ưu tiên và do các khóa không công bằng. Học cách phát hiện vấn đề (ghi log, Thread dump, VisualVM, Java Mission Control) và phòng tránh: thêm độ trễ ngẫu nhiên trước khi thử lại ( Thread.sleep), thuật toán không khóa, khóa công bằng qua ReentrantLock với cờ fairness ( new ReentrantLock(true)), thiết kế miền tới hạn gọn gàng và tránh lạm dụng setPriority() và synchronized.
    Có sẵn
  • Bộ sưu tập thread-safe: ConcurrentHashMap và các loại khác

    JAVA 25 SELF
    Cấp độ 53,Bài học 2
    Trong bài giảng này, chúng ta sẽ phân tích vì sao các bộ sưu tập thông thường ( ArrayList, HashMap) nguy hiểm trong môi trường đa luồng, và những lựa chọn thay thế an toàn cho luồng mà gói java.util.concurrent cung cấp: ConcurrentHashMap, CopyOnWriteArrayList, ConcurrentLinkedQueue, các cấu trúc dựa trên skip-list và BlockingQueue. Chúng ta sẽ bàn về các thao tác nguyên tử như merge, putIfAbsent, computeIfAbsent, so sánh với Collections.synchronizedMap, xem các ví dụ thực tế và những lỗi thường gặp (iterator nhất quán yếu, chuỗi thao tác không nguyên tử, v.v.).
    Có sẵn
  • AtomicInteger, AtomicReference: các thao tác nguyên tử

    JAVA 25 SELF
    Cấp độ 53,Bài học 3
    Tại sao phép tăng i ++ không hoạt động trong môi trường đa luồng, thao tác nguyên tử là gì và gói java.util.concurrent.atomic cung cấp chúng như thế nào. Cùng tìm hiểu AtomicInteger và AtomicReference, các phương thức incrementAndGet(), compareAndSet(...), cơ chế bên trong CAS (Compare-And-Swap), cũng như khi nào nên chọn synchronized và khi nào — LongAdder. Cuối cùng — các lỗi điển hình: thao tác phức tạp, ABA và tính an toàn luồng của các đối tượng lồng.
    Có sẵn
  • Chẩn đoán và gỡ lỗi chương trình đa luồng

    JAVA 25 SELF
    Cấp độ 53,Bài học 4
    Cách chụp và đọc Thread Dump bằng jstack, VisualVM và IDE, nhận biết trạng thái luồng ( RUNNABLE, BLOCKED, WAITING) và tìm vòng khóa lẫn nhau. Ta sẽ xem xét giám sát luồng trong Java Mission Control và Java Flight Recorder, thực hành logging (tên luồng, vào/ra khỏi synchronized), giảm thiểu lock, kiểm thử tính cạnh tranh với CountDownLatch và phân tích một case deadlock thực tế. Cuối cùng — các lỗi thường gặp và cách tránh chúng.
    Có sẵn
  • Giới thiệu về tính song song

    JAVA 25 SELF
    Cấp độ 54,Bài học 0
    Trong bài giảng này, chúng ta phân tích sự khác biệt giữa đa luồng và tính song song: khi nào quan trọng là tính phản hồi, và khi nào là tăng tốc thực sự trên nhiều lõi. Sẽ thảo luận việc tạo luồng bằng Thread, triển khai Runnable và các pool cấp cao ExecutorService, xem một ví dụ đơn giản về cộng mảng, phân tích khi nào tính song song giúp ích và khi nào gây hại, cũng như các vấn đề điển hình: race condition, đồng bộ hóa bằng synchronized, deadlock và cân bằng tải. Cuối cùng — bảng so sánh và trực quan hóa các kịch bản.
    Có sẵn
  • ExecutorService, Callable, Future: chạy tác vụ

    JAVA 25 SELF
    Cấp độ 54,Bài học 1
    Thực hành đa luồng một cách bài bản: chuyển giao tác vụ cho ExecutorService thay vì tự tạo Thread, quản lý pool, hàng đợi và vòng đời ( shutdown(), shutdownNow()). Phân tích sự khác nhau giữa Runnable và Callable<T>, lấy kết quả qua Future và các phương thức của nó ( get(), isDone(), cancel(...), isCancelled()). Trình diễn cách chạy nhiều tác vụ, invokeAll/ invokeAny, xử lý ExecutionException và các lỗi điển hình.
    Có sẵn
  • Stream song song: cú pháp và ứng dụng

    JAVA 25 SELF
    Cấp độ 54,Bài học 2
    Tìm hiểu cách chuyển một luồng dữ liệu thông thường sang xử lý song song chỉ bằng một dòng — qua parallelStream() hoặc .parallel(), những gì diễn ra bên dưới trong ForkJoinPool.commonPool(), khi nào tính song song thực sự tăng tốc tính toán (bộ sưu tập lớn, thao tác “nặng”) và khi nào nó có thể làm chậm. Chúng tôi sẽ đưa ra ví dụ về lọc, tổng hợp, sắp xếp, đo hiệu năng và phân tích các lỗi điển hình: tác dụng phụ trong forEach, giữ thứ tự, lựa chọn collection và cấu hình mức độ song song.
    Có sẵn
  • ForkJoinPool và RecursiveTask: các tác vụ đệ quy

    JAVA 25 SELF
    Cấp độ 54,Bài học 3
    Hướng dẫn thực hành về tính toán song song trong Java: cách hoạt động của bộ chứa tác vụ ForkJoinPool và các tác vụ đệ quy RecursiveTask<T>/ RecursiveAction, vì sao thuật toán work-stealing hữu ích, cách chia nhỏ tác vụ bằng fork() và hợp nhất kết quả với join() bên trong compute(). Chúng ta sẽ xem cách chạy qua pool.invoke(), ví dụ tính tổng mảng và tìm giá trị lớn nhất, vai trò của ForkJoinPool trong parallelStream(), cũng như các lỗi thường gặp và cách tránh chúng.
    Có sẵn
  • Các thực tiễn tốt nhất cho lập trình song song

    JAVA 25 SELF
    Cấp độ 54,Bài học 4
    Hướng dẫn thực hành về lập trình song song trong Java: khi nào nên dùng ExecutorService, nơi parallelStream hữu ích, và cho những tác vụ nào cần ForkJoinPool. Bàn về tính an toàn luồng với ConcurrentHashMap/ CopyOnWriteArrayList và các lớp nguyên tử ( AtomicInteger), đo hiệu năng bằng System.nanoTime() và JMH, xử lý lỗi từ Future.get() và ForkJoinTask, phản ứng đúng với InterruptedException, cũng như mẹo ghi log ( Thread.currentThread().getName()) và kiểm thử ( Awaitility). Cuối cùng — bảng chọn công cụ và các lỗi thường gặp.
    Có sẵn
  • Giới thiệu về CompletableFuture

    JAVA 25 SELF
    Cấp độ 55,Bài học 0
    Trong bài giảng này, chúng ta sẽ phân tích vì sao mã đồng bộ dẫn tới việc bị chặn, những hạn chế của Future (như get() dạng blocking), và cách lớp CompletableFuture trong gói java.util.concurrent thay đổi phong cách làm việc với tính bất đồng bộ. Chúng ta sẽ luyện tập chạy tác vụ nền bằng supplyAsync, đăng ký nhận kết quả bằng thenAccept/ thenApply, bàn về vai trò của pool ForkJoinPool và các lỗi thường gặp: dùng get()/ join() trên luồng chính, thiếu xử lý lỗi qua exceptionally/ handle, v.v.
    Có sẵn
  • Tác vụ bất đồng bộ: thenApply, thenAccept, thenRun

    JAVA 25 SELF
    Cấp độ 55,Bài học 1
    Phân tích cách khởi chạy và kết hợp các tính toán bất đồng bộ với CompletableFuture: cách khởi động tác vụ qua supplyAsync và runAsync, sự khác nhau giữa các trình xử lý thenApply, thenAccept, thenRun, và khi nào nên chọn các phiên bản bất đồng bộ thenApplyAsync/ thenAcceptAsync/ thenRunAsync. Sẽ bàn về luồng thực thi ( ForkJoinPool hoặc Executor của bạn), kiểu kết quả ( CompletableFuture<T>, CompletableFuture<Void>) và các lỗi thường gặp: gọi chặn get()/ join(), lỗi không được xử lý nếu thiếu exceptionally/ handle/ whenComplete, cũng như việc cố gắng dùng kết quả bên trong thenRun.
    Có sẵn
  • 1
  • ...
  • 23
  • 24
  • 25
  • 26
  • 27
  • ...
  • 30
Học
  • Đăng ký
  • Khóa học Java
  • Trợ giúp bài tập
  • Bảng giá
  • Cú pháp Java
Cộng đồng
  • Người dùng
  • Bài viết
  • Diễn đàn
  • Trò chuyện
  • Câu chuyện thành công
  • Hoạt động
  • Chương trình giới thiệu
Công ty
  • Về chúng tôi
  • Liên hệ
  • Đánh giá
  • Phòng báo chí
  • CodeGym cho EDU
  • Câu hỏi thường gặp
  • Hỗ trợ
CodeGymCodeGym là một khóa học trực tuyến để học lập trình Java từ đầu. Khóa học này là cách hoàn hảo để nắm vững Java cho người mới bắt đầu. Nó chứa 1200+ bài tập với kiểm tra ngay lập tức và phạm vi lý thuyết cơ bản cần thiết về Java. Để giúp bạn thành công trong học tập, chúng tôi đã triển khai một bộ tính năng tạo động lực: bài kiểm tra, dự án lập trình, nội dung về phương pháp học hiệu quả, và hỗ trợ sự nghiệp lập trình viên Java.
Theo dõi chúng tôi
Ngôn ngữ giao diện
English Deutsch Español हिन्दी Français Português Polski বাংলা 简体中文 मराठी தமிழ் Italiano Bahasa Indonesia 繁體中文 Nederlands 日本語 한국어 Bulgarian Danish Hungarian Basa Jawa Malay Norwegian Romanian Swedish Telugu Thai Українська Filipino Turkish Azərbaycan Русский
Vietnamese
"Lập trình viên được tạo nên, không sinh ra" © 2026 CodeGym
MastercardVisa
"Lập trình viên được tạo nên, không sinh ra" © 2026 CodeGym