Tôi đọc một số bài viết về vấn đề tương tranh nhưng tôi vẫn không chắc chắn về điều gì đó. Tôi có thể nói rằng khi sử dụng đồng bộ, tôi nhận được các chức năng dễ bay hơi miễn phí, bởi vì khi khóa trên một đối tượng sẽ được giải phóng, luồng tiếp theo luôn đọc đối tượng đã sửa đổi. Với biến động, giá trị của một đối tượng được phản ánh ngay lập tức với các chủ đề khác. Nhưng khi tôi sử dụng đồng bộ, không có khả năng phản ánh ngay lập tức nó do khóa trên vật thể. Khi khóa được giải phóng, chỉ khi đó một luồng khác có thể truy cập nó. Vì vậy, tôi không phải quan tâm đến việc phản ánh giá trị ngay lập tức cho các chủ đề khác. Tôi có hiểu điều này đúng không?Java Khi sử dụng đồng bộ, tôi có nhận được chức năng dễ bay hơi không?
[UPDATE]
Ví dụ in luôn luôn 1 2 3 4 5 6 7 8 9 không dễ bay hơi.
package main;
public class Counter
{
public static long count = 0;
}
public class UseCounter implements Runnable
{
public void increment()
{
synchronized (this)
{
Counter.count++;
System.out.print(Counter.count + " ");
}
}
@Override
public void run()
{
increment();
increment();
increment();
}
}
public class DataRace
{
public static void main(String args[])
{
UseCounter c = new UseCounter();
Thread t1 = new Thread(c);
Thread t2 = new Thread(c);
Thread t3 = new Thread(c);
t1.start();
t2.start();
t3.start();
}
}
Cập nhật của bạn: Những gì nó hiện đang in khó có nghĩa là bất cứ điều gì. Các điều kiện chủng tộc dữ liệu thường lén lút khi bạn ít mong đợi chúng nhất và chúng rất khó tái tạo và giải quyết. Điều quan trọng là nếu bạn đã tuân theo các quy tắc của Mô hình bộ nhớ Java. –
Ok cảm ơn. Mặc dù tôi không thể tái tạo hành vi sai trái mà không dễ bay hơi (thậm chí khi tôi chạy mã 1.000.000 lần trong một vòng lặp), tôi sẽ ghi nhớ nó. – Bevor