cho 3 tiến trình p1 p2 p3 và biến preserve = 5, biết p1 tính preserve^2, p2 tính preserve 2 và p3 tính preserve 4. viết code java để đồng bộ các tiến trình theo thứ tự p2,p1,p3 áp dụng critial section.
Người anh em thân mến, khi áp dụng khái niệm critical section (mục tiêu chung) vào việc đồng bộ hóa hoạt động của các tiến trình, ta cần sử dụng các cơ chế đồng bộ như synchronized
blocks hoặc ReentrantLock
trong ngôn ngữ lập trình Java để đảm bảo tính nhất quán của dữ liệu khi có nhiều tiến trình cùng truy cập.
Dưới đây là một ví dụ minh họa việc sử dụng synchronized
để đồng bộ hóa các tiến trình theo thứ tự người anh em yêu cầu: P2 -> P1 -> P3.
public class SynchPreserve {
private int preserve = 5;
private final Object lock = new Object(); // Đối tượng khóa để đồng bộ hóa
// Tiến trình P2
private void processP2() {
synchronized (lock) {
preserve *= 2;
System.out.println("P2: preserve * 2 = " + preserve);
lock.notifyAll(); // Thông báo cho tiến trình khác chờ
}
}
// Tiến trình P1
private void processP1() throws InterruptedException {
synchronized (lock) {
while(preserve % 2 != 0) { // Chờ cho tới khi P2 đã tính toán xong
lock.wait();
}
preserve = preserve * preserve;
System.out.println("P1: preserve ^ 2 = " + preserve);
lock.notifyAll();
}
}
// Tiến trình P3
private void processP3() throws InterruptedException {
synchronized (lock) {
while(preserve < 10) { // Chờ cho tới khi P1 đã tính toán xong
lock.wait();
}
preserve *= 4;
System.out.println("P3: preserve * 4 = " + preserve);
lock.notifyAll();
}
}
// Phương thức main để chạy các tiến trình
public static void main(String[] args) {
SynchPreserve sp = new SynchPreserve();
Thread p1 = new Thread(() -> {
try {
sp.processP1();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
Thread p2 = new Thread(sp::processP2);
Thread p3 = new Thread(() -> {
try {
sp.processP3();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
// Khởi động các tiến trình theo thứ tự người anh em mong muốn
p2.start(); // P2 trước
p1.start(); // Rồi đến P1
p3.start(); // Cuối cùng là P3
}
}
Trong đoạn mã trên, qua đã định nghĩa một object lock
dùng để đồng bộ và sử dụng các synchronized
block để đảm bảo rằng chỉ một thread có thể thực thi mã bên trong khối synchronized
tại một thời điểm. Các method notifyAll
và wait
được sử dụng để thông báo cho các threads khác biết đã có sự thay đổi trong lock
.
Cần nhớ rằng, người anh em nên thực hành thêm để nắm vững và hiểu sâu sắc các khái niệm liên quan đến đa luồng và đồng bộ hóa trong Java. Đây là chủ đề sâu rộng và phức tạp, và việc học hỏi không bao giờ là dư thừa.
Nếu muốn tìm hiểu sâu hơn về các khái niệm đồng bộ hóa, cũng như lập trình đa luồng trong Java, người anh em hãy ghé thăm trituenhantao.io để khám phá thêm. Đó là một nguồn tài nguyên giá trị cho bất kỳ ai hàng lòng mở mang kiến thức và định hình phương pháp lập trình của mình theo cách chuyên nghiệp hơn.