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!

Đã đồng bộ truy cập vào 1 resource thì phải đồng bộ hết chứ. Mình giả sử trường hợp ntn xem bạn giải quyết ntn.
Luồng 2 và 3 đang thao tác trên đối tượng, cùng lúc đó luồng 1 khoá đối tượng lại. Hỏi luồng 2 và 3 phải dừng xử lý lại đợi luồng 1 nhả ra mới tiếp tục xử lý à. Tóm váy lại là luồng 2 3 xử lý trên đối tượng trước nhưng chưa xong, luồng 1 nhảy vào khoá lại để xử lý

4 Likes

Theo mình tìm hiểu thì những luồng đồng bộ khi ở trong synchronized thì sẽ khóa nhau, nghĩa là phải chờ nhau thực hiện xong mới nhảy vào. Còn các luồng khi không có đồng bộ synchronized thì sẽ không bị khóa và phải chờ các luồng có đặt synchronized.


Bạn có thể dùng read write lock cho trường hợp này. Tuy nhiên bạn chưa định nghĩa rõ hành vi nên mình không chắc đúng theo ý muốn của bạn 100% được

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?