Yêu cầu thg 4 30, 2019 4:42 SA 230 0 1
  • 230 0 1
0

JAVA - Làm sao để quản lý các luồng đồng bộ trong JAVA

Chia sẻ
  • 230 0 1

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


Đã trả lời thg 5 3, 2019 9:00 SA
0

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ứ

Chia sẻ
Avatar Nguyen Van Hung @HungNguyenVan
thg 5 9, 2019 9:05 SA

@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 ạ.

thg 5 10, 2019 4:57 SA

@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();
Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí