Tôi đã viết một số mã đa luồng trong java và phương thức đồng bộ đã thay đổi biến, nhưng nó không đồng bộ mã của tôi, tôi vẫn nhận được các giá trị ngẫu nhiên. Có mã của tôi:Tại sao phương thức đồng bộ không được truy cập đồng bộ trong chương trình đa luồng này?
public class Main {
public static void main(String[] args) throws Exception {
Resource.i = 5;
MyThread myThread = new MyThread();
myThread.setName("one");
MyThread myThread2 = new MyThread();
myThread.start();
myThread2.start();
myThread.join();
myThread2.join();
System.out.println(Resource.i);
}
}
class MyThread extends Thread {
@Override
public void run() {
synMethod();
}
private synchronized void synMethod() {
int i = Resource.i;
if(Thread.currentThread().getName().equals("one")) {
Thread.yield();
}
i++;
Resource.i = i;
}
}
class Resource {
static int i;
}
Đôi khi tôi nhận được 7, đôi khi 6, nhưng tôi đã đồng bộ synMethod
, như tôi hiểu không có sợi nên đi ở phương pháp này trong khi một số chủ đề khác thực hiện này, vì vậy hoạt động nên nguyên tử, nhưng họ không, và tôi không thể hiểu tại sao? Bạn có thể vui lòng giải thích cho tôi và trả lời - làm thế nào tôi có thể sửa nó?
gì bạn khóa các vấn đề đồng bộ. Tôi đề nghị bạn không phải là tiểu học Thread vì điều này có thể gây ra kết quả đáng ngạc nhiên. –