Nếu tôi truy cập một đối tượng bên trong một phương thức được đồng bộ hóa hoặc khối được đồng bộ hóa, tất cả đối tượng trong phần tử truy cập đó cũng được đồng bộ hóa không?Đồng bộ hóa của Java có cập nhật bộ đệm ẩn hoàn chỉnh hay chỉ đối tượng tôi đã đồng bộ hóa không?
Hãy tưởng tượng có một đối tượng Queue
có phương thức add()
và take()
được đồng bộ hóa, chấp nhận và phân phát đối tượng phức tạp Thing
. Thing
có rất nhiều danh sách với các đối tượng khác nhau trong đó.
Bây giờ, chủ đề hình ảnh Before
tạo Thing
và đặt một số đối tượng hiện có vào Thing
, sửa đổi một số đối tượng này, v.v. Chủ đề Before
thêm Thing
đến Queue
. Chủ đề sau bit After
mất Thing
từ Queue
.
CÂU HỎI: Thing
và tất cả các con/subobject của nó có cùng trạng thái như Before
để chúng ở trong đó không? Ngay cả khi chuỗi After
có thể hoạt động trên một trong các phần tử con này sớm hơn một chút? Bởi vì tôi hình ảnh bộ vi xử lý cho chủ đề After
vẫn có thể có một số thông tin được lưu trong bộ nhớ cache trên subelement đó (địa chỉ của subobject đó vẫn giống nhau). Tất cả các công cụ được lưu trong bộ nhớ cache này sẽ bị vô hiệu hóa chỉ khi truy cập đối tượng cha Thing
theo cách được đồng bộ hóa?
Vui lòng không đưa ra câu trả lời như sử dụng lib đồng thời, v.v. Tôi muốn hiểu điều gì đang diễn ra.
vâng tôi biết điều đó, nhưng đó không phải là câu hỏi của tôi :-) Đồng bộ hóa cũng phải ảnh hưởng đến bộ nhớ cache của bộ xử lý, do đó các thay đổi được xóa vào bộ nhớ chung, đó là câu hỏi của tôi. Tôi biết rằng nếu bạn truy cập một tài liệu tham khảo mà không đi qua một khối đồng bộ từ các chủ đề song song mulitple nó sẽ được tất cả mọi thứ sai lầm. Nhưng điều này là nhiều hơn về việc chuyển các công cụ từ một luồng này sang luồng khác và đảm bảo rằng datastrucuture vẫn chính xác. Hiểu những gì tôi nói không? –
Xem câu trả lời của Paulo. Chặn các luồng chỉ là một khía cạnh của việc đồng bộ hóa, mối quan hệ xảy ra trước đó (xóa bộ nhớ đệm) là quan trọng nếu không nhiều hơn. Nó cũng phức tạp hơn rất nhiều để hiểu và các API không rõ ràng về việc xảy ra trước đây (ví dụ, tôi nghĩ SwingUtilities.invokeLater đã kích thích một sự kiện xảy ra trước đó, nhưng tôi không chắc chắn 100%). Tôi khuyên bạn nên sử dụng Java Concurrency in Practice từ Goetz et al. Họ đặt rất nhiều nhấn mạnh vào xảy ra trước đây. – toto2
Cảm ơn bạn đã downvoting mà không có lời giải thích ... @ Franz: Tôi không hỏi rằng bạn đang hỏi về mô hình bộ nhớ. Hãy để tôi xem xét lại câu trả lời của tôi. – musiKk