[Java Concurrency] Giới thiệu Fork/Join Framework và ForkJoinPool trong Java

Fork/Join Framework được thêm vào từ Java 7. Nó cung cấp các công cụ để tăng tốc độ xử lý song song, giúp nâng cao performance cho ứng dụng bằng cách cố gắng tận dụng tất cả các processors có sẵn. Việc này được thực hiện thông qua cách tiếp cận divide and conquer. Trái tim của Fork/Join Framework là class ForkJoinPool, nó là một phần mở rộng của class AbstractExecutorService, nó được cài đặt dựa trên giải thuật work-stealing.

Tiếp tục đọc

#java, #java-concurrency

[Java Concurrency] ExecutorService và ScheduledExecutorService trong Java

Trong các ứng dụng Java, việc tạo và quản lý một số lượng nhỏ các threads (luồng) thì không khó. Nhưng với một ứng dụng lớn, khi mà số lượng các threads phải tạo để chạy các task đồng thời có thể lên tới hàng chục, thậm chí hàng trăm threads thì lại là một vấn đề lớn. Vì vậy, tách biệt việc tạo và quản lý các threads ra khỏi phần còn lại của ứng dụng là việc nên làm. Bên cạnh đó việc tạo một thread sẽ phải trả giá về cả performance và memory. Vì vậy nó là một ý tưởng tốt nếu chúng ta có thể re-use các thread đã tạo.

Tiếp tục đọc

#java, #java-concurrency

[Java Concurrency] Thread Pools

Thread Pools là một giải pháp khi bạn cần giới hạn số lượng threads chạy trong ứng dụng của bạn tại một thời điểm. Nếu chúng ta không có sự giới hạn này, thì mỗi khi có thread mới được tạo và cấp phát bộ nhớ stack cho chúng thì sẽ có vấn đề về performance.

Tiếp tục đọc

#java, #java-concurrency

[Java Concurrency] Blocking Queues

Một blocking queue là một hàng đợi sẽ được khóa lại khi bạn lấy phần tử từ hàng đợi nhưng nó đang bị rỗng (dequeue), hoặc khi bạn đẩy thêm phần tử vào hàng đợi nhưng nó đã bị đầy (enqueue).

Nếu một luồng cố gắng lấy phần tử từ một hàng đợi đang trống rỗng nó sẽ bị blocked lại cho tới khi có một luồng nào đó đẩy thêm phần tử vào hàng đợi. Nếu một luồng cố gắng đẩy phần từ vào một hàng đợi đã đầy nó sẽ bị blocked lại cho tới khi có một luồng nào đó lấy bớt phần tử ra khỏi hàng đợi hoặc xóa hàng đợi.

Tiếp tục đọc

#java, #java-concurrency

[Java Concurrency] Daemon Thread trong Java

Java chia threads làm hai loại: một loại thông thườngDaemon Thread. Chúng chỉ khác nhau ở cách thức ngừng hoạt động. Trong một chương trình các luồng thông thường và luồng Daemon chạy song song với nhau. Khi tất cả các luồng thông thường kết thúc, JVM sẽ tìm tất cả các luồng Daemon đang chạy và ngừng tất cả luồng Daemon lại bất kể nó đang làm việc gì.

Tiếp tục đọc

#java, #java-concurrency

[Java Concurrency] Tín hiệu luồng – Thread Signaling

Mục đích của thread signaling (tín hiệu luồng) là cho phép các luồng gửi tín hiệu cho nhau. Ngoài ra, thread signaling cho phép các luồng chờ tín hiệu từ các luồng khác. Chẳng hạn, một luồng B có thể đợi tín hiệu từ luồng A báo rằng dữ liệu đã sẵn sàng để được xử lý.

Tiếp tục đọc

#java, #java-concurrency

[Java Concurrency] Khởi tạo và chạy các Threads trong Java

Các threads trong Java là các objects giống như bất kỳ các objects nào khác của Java. Các threads là instance của class java.lang.Thread hoặc là instance của các lớp con kế thừa từ class này.

Trong Java ta có thể tạo ra một luồng bằng một trong hai cách sau: tạo 1 đối tượng của lớp được extend từ class Thread hoặc implements từ interface Runnable.

Tiếp tục đọc

#java, #java-concurrency

[Java Concurrency] Khối Synchronized trong Java

Một khối được đồng bộ hóa (synchronized block) trong Java đánh dấu một phương thức hoặc một khối code được đồng bộ (synchronized). Các khối được đồng bộ sẽ tránh được xung đột hay mất mát dữ liệu.

Tiếp tục đọc

#java, #java-concurrency

[Java Concurrency] Từ khóa volatile trong Java

Từ khóa volatile trong Java được sử dụng để đánh dấu một biến Java “được lưu trữ trong bộ nhớ chính“. Nói một cách chính xác hơn nghĩa là, mỗi lần đọc một biến volatile, sẽ đọc từ main memory của máy tính chứ không phải đọc từ CPU Cache; và mỗi lần ghi vào biến volatile thì giá trị sẽ được ghi trở lại main memory ngay lập tức.

Tiếp tục đọc

#java, #java-concurrency

[Java Concurrency] Concurrency vs. Parallelism

Các thuật ngữ concurrency (đồng thời) và parallelism (song song) thường được sử dụng liên quan đến các chương trình đa luồng (multi-threaded). Nhưng chính xác thì concurrencyparallelism có nghĩa là gì, và liệu có phải cả hai thuật ngữ này có chung một ý nghĩa?

Tiếp tục đọc

#java, #java-concurrency