public class Main{
public static void main(String[] args) throws Exception {
// Creating objects for class Check(2 different objects)
Check c = new Check("s1");
Check c1 = new Check("s2");
c.start();c1.start();
}
}
class Check extends Thread{
Check(String name){super(name);}
private Integer ab = 2;
public void run(){
synchronized (ab) {
System.out.println(Thread.currentThread().getName());
for(int i=0;i<10;i++)System.out.print(i+" ");
}
}
}
Ở đây tôi đã đồng bộ hóa trên biến ab. Và tôi đã tạo ra hai trường hợp khác nhau của lớp Kiểm tra cũng có, nhưng tôi luôn luôn nhận được đầu ra cho s1 theo sau bởi s2 hoặc ngược lại, nhưng không trộn lẫn, tại sao là như vậy? khi tôi đã tạo ra hai đối tượng riêng biệt (trong chính), do đó, hai chủ đề khác nhau, hai biến ab khác nhau, do đó, làm thế nào nó sẽ trở thành một nguồn tài nguyên được chia sẻ cho hai đối tượng khác nhau?Đồng bộ hóa chủ đề trên biến mẫu Integer
B.T.W., bạn không đồng bộ hóa trên _variable_, bạn đang đồng bộ hóa trên đối tượng mà biến tham chiếu. Đó là một sự khác biệt quan trọng bởi vì một số người đã phạm sai lầm không phải realiznig mà biến có thể ám chỉ đến các đối tượng khác nhau vào những thời điểm khác nhau, và một số đã phạm sai lầm khi không nhận ra rằng cùng một đối tượng có thể được tham chiếu bởi nhiều hơn một biến. –
Mã này trông giống mã kiểm tra hơn là trường hợp thực, nhưng nếu bạn muốn đồng bộ hóa trên khóa không có khóa, nhưng chỉ an toàn, [Số] (https://docs.oracle.com/javase/8/ docs/api/java/lang/Number.html), bạn có thể sử dụng [AtomicInteger] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html). –
@jameslarge: Tôi hiểu, những gì bạn đang nói. Tôi đã không chính xác về điều đó bởi vì vấn đề của tôi tập trung vào một số điểm khác. Dù sao, cảm ơn. :) – Santanu