01/10/2018, 09:29

Thắc mắc về lập trình multithread java

Hiện tại e đang học phần multithread java có vài thắc mắc nhờ mọi người giúp đỡ

  1. Kết quả của việc build 1 project trong các lần khác nhau thì cho kết quả khác nhau đúng k ạ. Ví dụ như có lần thì thread 1 chạy trước, có cái thì thread 2 chạy trước(cùng 1 hàm xuất ra chuỗi số nhưng thứ tự xuất ra màn hình các lần có thứ tự khác nhau)… cái này hình như liên quan đến độ ưu tiên.

  2. Về việc đồng bộ hóa. Mong mọi người giải thích giùm e đoạn code sau( e lấy trên mạng) là tại sao thằng down lại lấy giá trị là 10 rồi giảm xuống 0 ( thật ra e chưa hiểu lắm về cách khai báo trong đoạn code (MyThread3) này lắm vì e còn gà chưa thấy kiểu khai báo ntn bao h mong mn nhẹ tay). Chỉ hiểu kết quả là chạy từ 0 đến rồi từ 10 về 0, lúc đầu e nghĩ là giá trị c nó phải reset về 0 rồi chạy xuống giá trị âm.

    class Count{
    int c = 0;
    public void up(){
    for(int i = 0; i < 10; i++){
    System.out.println("up: " + c++);
    }
    }

      public void down(){
         for(int i = 0; i < 10; i++){
             System.out.println("down: " + c--);
         }
     }
    

    }

    public class MyThread3 {
    Count count = new Count();

     public MyThread3(){
         new Thread(new Runnable() {
              
             @Override
             public void run() {
                     count.up();
                     System.out.println("UP: " + count.c);                   
             }
         }).start();
          
         new Thread(new Runnable() {
              
             @Override
             public void run() {
                 count.down();
                 System.out.println("DOWN " + count.c);
    
             }
         }).start();
     }
     public static void main(String[] args) {
         new MyThread3();
     }
    

    }

Phạm Vinh viết 11:38 ngày 01/10/2018

Bạn cho mình xin link code để mình xem output nó như thế nào nhé vì bạn giải thích khó hiểu quá

Vu Van Chung viết 11:32 ngày 01/10/2018

Câu 1: Đúng là các thread này do HĐH phân bố tài nguyên nên chúng có thể chạy ở các thời điểm khác nhau tuỳ từng lần chạy khác nhau.
Câu 2: vì các thread dùng chung tài nguyên của tiến trình nên khi khi thực hiện xong cái new Thread() đầu tiên thì c đã tăng lên 10. Cái new Thread thứ 2 dùng c chính là cái c sau khi đã thực hiện xong cái new Thread đầu tiên.
Không biết câu trả lời của mình như vậy có đúng hay làm bạn đỡ thắc mắc chưa?

Nguyen Ca viết 11:35 ngày 01/10/2018

Chú thay for(int i = 0; i < 1000; i++) chú sẽ thấy sự khác biệt. không đảm bảo biến count của chú tăng lên 10 thread 2 sẽ chạy
Vấn đề của chú giờ nó liên quan đên share resource trong mutithread
Khi chạy muti thread của chú nó sẽ chạy giống như dưới

biến count đươc load lên Main memory sau đó mỗii thread sẽ nắm giữ biên đó trong cache riêng, thực hiên tính toán xong
sẽ ghi ngược lại vào Main Memory, vấn đề là không biết khi nào nó sẽ ghi vào main memory.
Vấn đề bài toán của chú là làm sao để đảm bảo cái count tăng lên 10(hoặc 1000 gì đó) thread 2 mới lấy để chạy?
Chú tìm hiểu về Race condition, Java Volatile, synchronized để hiểu thêm cơ chế và cách làm.

Cái new Thread thứ 2 dùng c chính là cái c sau khi đã thực hiện xong cái new Thread đầu tiên.

Không chắc là nó lấy lúc nào đâu.

Vu Van Chung viết 11:35 ngày 01/10/2018

Đúng rồi, mình viết chưa đúng, không chắc là nó chuyển thread lúc nào!

Nguyen Ca viết 11:40 ngày 01/10/2018

định trả lởi cho @trongnhan8195 mà tự nhiên nó reply chú =))

Hoang Trong Nhan viết 11:31 ngày 01/10/2018

cảm ơn a. Câu thứ 2 e chưa hiểu lắm. Do e k hiểu là tại sao cái thread 2 có thể lấy được c của cái thread đầu tiên trong khi k có cái giá trị c trả về nào

Hoang Trong Nhan viết 11:36 ngày 01/10/2018

chronized để h

cảm ơn a. E sẽ tìm hiểu thêm

Vu Van Chung viết 11:38 ngày 01/10/2018

c là biến của tiến trình, mọi thread dùng chung biến của tiến trình. Nói một cách dễ hiểu hơn, thì c là biến global, do đó, tất cả các thread đều dùng được nó!

Bài liên quan
0