JAVA - Làm sao để quản lý các luồng đồng bộ trong JAVA
Xin chào mọi người! Em đang tìm hiểu về đa luồng và đồng bộ hóa trong Java. Vấn đề em đang thắc mắc là: em sử dụng 1 đối tượng o ở 3 luồng khác nhau. Em muốn đối tượng này được đồng bộ hóa ở luồng số 1 thôi. Có nghĩa là khi luồng số 1 đang thao tác trên đối tượng o thì 2 luồng còn lại sẽ phải chờ còn nếu đối tượng o đang được thao tác trên 2 luồng số 2 hoặc 3 thì các luồng khác không cần chờ. Em có thể làm việc bằng cách nào ạ. Em đã thử 2 cách nhưng không được.
Cách 1: Đặt synchronized ở cả 3 luồng. Cách này cả 3 luồng sẽ phải chờ nhau.
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
synchronized(o){
process1(o);
}
}
});
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
synchronized(o){
process2(o);
}
}
});
Thread thread3 = new Thread(new Runnable() {
@Override
public void run() {
synchronized(o){
process3(o);
}
}
});
thread1.start();
thread2.start();
thread3.start();
Cách 2: Chỉ đặt synchronized ở luồng số 1. Cách này thì cũng như hoàn toàn không đồng bộ
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
synchronized(o){
process1(o);
}
}
});
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
process2(o);
}
});
Thread thread3 = new Thread(new Runnable() {
@Override
public void run() {
process3(o);
}
});
thread1.start();
thread2.start();
thread3.start();
Liệu em có thể chỉ đồng bộ trên luồng số 1 được không ạ? Mong được mọi người chỉ giáo. Em xin cảm ơn!
1 CÂU TRẢ LỜI
tại sao em lại đặt synchronized ở phương thức run của Thread nhỉ, em phải đặt synchronized ở chỗ nào tác động đến Object o của em chứ
@chuyenbka Em viết đoạn code này để thử synchronized của Java. Các hàm process1, process2 và process3 là các hàm tác động đến object o đấy ạ.
@HungNguyenVan Các hàm process1, process2, process3 là các hàm tác động đến object o, thì em ko cần viết synchronized rồi với viết hàm nữa mà viết luôn thế này Thread thread1 = new Thread(new Runnable() { @Override public void run() { process2(o); } });
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
process2(o);
}
});
Thread thread3 = new Thread(new Runnable() {
@Override
public void run() {
process3(o);
}
});
thread1.start();
thread2.start();
thread3.start();