Asked Apr 30th, 4:42 AM 101 0 1
  • 101 0 1
0

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

Share
  • 101 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 ANSWERS


Answered May 3rd, 9:00 AM
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ứ

Share
Nguyen Van Hung @HungNguyenVan
May 9th, 9:05 AM

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

0
| Reply
Share
Phạm Ngọc Chuyển @chuyenbka
May 10th, 4:57 AM

@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();
0
| Reply
Share