Nội dung bài viết
Video học lập trình mỗi ngày
Bài viết này được đưa vào Series: Lập trình đồng thời trong các ngôn ngữ
Nếu bạn là người mới tìm hiểu về Lập trình đồng thời thì có thể xem ngay hướng dẫn thực hành này về [Virtual thread: Đối thủ xứng tầm với Goroutine] và cố gắng hiểu các từ khoá trong config dự án.
Đó là một cách tiết cận nhanh không mất thời gian nhiều. Và hãy phân biệt hai khái niệm, lập trình đồng thời khác với dự án lượng đồng thời cao, một bên là cấp độ của ngôn ngữ và một bên cấp độ của cả hệ thống tham gia.
Thread nó rất khác với Virtual Thread
Code và check run có trong: 1 triệu thread tôi mất chưa đến 1 phút tất nhiên còn hơn thế nữa...
Anh em cũng thấy đấy, ở cấp độ ngôn ngữ thì việc ra đời của Virtual Thread
trong JAVA 21 thì cũng được xem là kịp thời cho sự phát triển của Goroutine
trong Go.
Chỉ cần hiểu như thế này cho các round phỏng vấn như món tráng miệng đó là Thread
rất nặng, nó tương ứng mới các thread của hệ điều hành. Vì vậy chắc chắn có limited.
Còn Virtual Thread
rất nhẹ và được tạo và lên lịch bởi Java. Virtual Thread tiêu thụ rất ít tài nguyên. Về mặt lý thuyết, số lượng Virtual Thread có thể được tạo chỉ bị giới hạn bởi kích thước bộ nhớ của hệ thống. Trên một máy thông thường, việc tạo ra hàng triệu luồng ảo hoàn toàn không phải là vấn đề (đã chứng minh trong code, có thể sánh ngang với goroutine)
Virtual thread vì sao lại cần thiết
Trước hết, xét từ góc độ kỹ thuật, JAVA vẫn chiếm ưu trong lĩnh vực backend và cung cấp service cho bên ngoài, chiếm ưu thế nhưng không có nghĩa là tuyệt đối như cách đây 3 năm về trước, nhưng hiện tại với quy mô ổ định và hệ sinh thái toàn diện trong những dự án tài chính.
Xem xét thêm về dịch vụ của bạn yêu cầu 100% tài nguyên sức mạnh tính toán của CPU. Giả sử nếu một máy có thể xử lý 100% hệ thống của chúng ta thì bạn chắc sẽ chỉ cần một máy. Vậy nếu một máy chỉ đạt tới 50% thồi thì rất đơn giản là thêm một nữa là hai máy. Vậy bạn có thể giữ CPU của mình chạy ở công suất 100% không?
Nếu máy của bạn chỉ có thể đạt 50% thì bạn. cần hai; lý do rất đơn giản. Vậy bạn có thể giữ CPU của mình chạy ở công suất 100% không? Vì vậy, hãy trả lời câu hỏi này thì xem xét những vấn đề sau:
- Thread java vs Virtual Thread
- Hãy so sánh hai loại trên
- Thử so sánh virtual thread và ghé xem Goroutine nó thế nào?
- Cách sử dụng virtual thread như thế nào?
Code và check run có trong: 1 triệu thread tôi mất chưa đến 1 phút
Virtual Thread có sự nguy hiểm nào không?
Tất nhiên có nhiều điều phải cần giải thích thêm chứ không thể đơn giản như vậy được? Tiếp tục đi sâu vào và chúng ta sẽ thấy rằng việc nhiều threads
tham gia vào sử dụng một resource
chung thì sẽ gây ra những điều phiền toái. Rất đơn giản thôi, ví dụ chúng ta có lệnh connect mysql trong ứng dụng của mình như sau:
private static final String URL = "jdbc:mysql://localhost:3306/testdb";
private static final String USER = "root";
private static final String PASSWORD = "password";
public static void main(String[] args) {
// Sử dụng executor với virtual threads
try (var executor = Executors.newThreadPerTaskExecutor(Thread.ofVirtual().factory())) {
for (int i = 0; i < 10; i++) {
int taskId = i;
executor.submit(() -> {
try {
queryDatabase(taskId);
} catch (Exception e) {
e.printStackTrace();
}
});
}
}
}
Tất nhiên đây là một ví dụ để hiểu cho các anh em mới, thì có lẽ việc mỗi virtual thread: Ví dụ trên mỗi virtual thread tạo một kết nối mới đến MySQL. Điều này có thể gây ra sự cố nếu số kết nối vượt quá giới hạn của MySQL có đúng không?
Như vậy là mất an toàn khi sử dụng nhiều thread. Ngoài ra anh em thử suy nghĩ nó có bị blocking không? Và nếu có thì phải làm gì?...
Ở giai đoạn tiếp theo, tôi và anh em sẽ làm rõ một số khác niệm như "Xem xét sự an toàn trong Thread?"
OK... Xin chào!