Bài viết này article về từ khóa "đồng bộ hóa" của Java.Các chuỗi Java "đã đồng bộ hóa"
...
private int foo;
public synchronized int getFoo() { return foo; }
public synchronized void setFoo(int f) { foo = f; }
Nếu một người gọi muốn để tăng tài sản foo, đoạn code sau để làm như vậy không phải là thread-safe:
...
setFoo(getFoo() + 1);
Nếu hai luồng cố gắng để tăng foo cùng một lúc, các kết quả có thể là giá trị của foo được tăng lên một hoặc hai, tùy thuộc vào thời gian.
Bây giờ, câu hỏi của tôi:
Tại sao không phải là "đồng bộ" trên setFoo() ngăn chặn việc in đậm dòng trên?
'Sau đó, mỗi người trong số họ thêm một và gọi setFoo và kết quả cuối cùng là foo chỉ tăng một lần, thay vì hai lần' Tại sao? –
Vì mỗi Chủ đề cập nhật 'foo' thành cùng một giá trị. Ví dụ, mỗi người trong số họ nhận được giá trị 2, mỗi người trong số họ thêm 1 để có được 3, sau đó mỗi người trong số họ đặt giá trị thành 3. – rgettman
Nếu tôi hiểu đúng, thì không nên tuyên bố của bạn là "Sau đó, mỗi người trong số họ thêm một và gọi setFoo, và kết quả cuối cùng là foo được tăng lên ** hai lần **? ' –