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 đỡ
-
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.
-
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(); }
}
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á
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áinew Thread()
đầu tiên thì c đã tăng lên 10. Cáinew Thread
thứ 2 dùng c chính là cái c sau khi đã thực hiện xong cáinew 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?
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.
Không chắc là nó lấy lúc nào đâu.
Đúng rồi, mình viết chưa đúng, không chắc là nó chuyển thread lúc nào!
định trả lởi cho @trongnhan8195 mà tự nhiên nó reply chú =))
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
cảm ơn a. E sẽ tìm hiểu thêm
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ó!