Hãy nói rằng nó là một trình thu gom rác đánh dấu đồng thời.
Khi GC xử lý các con trỏ liên tục, nó chỉ đi qua chúng (bắt đầu từ gốc) và đánh dấu mọi khối dữ liệu gặp phải. Sau đó quét tất cả mọi thứ không đánh dấu. Mã khách hàng nên đánh dấu các khối dữ liệu mà nó sử dụng làm gốc.
Nhưng phải làm gì với các biến? Đây là một tình huống:
Vlà một biến, lưu trữ một con trỏ tới đối tượngA.Thread 1đọcVvà đình chỉ.Thread 2sửa đổiVvà làm cho nó trỏ đến đối tượngB.- Trình thu gom rác chạy giai đoạn "đánh dấu" của nó và các cuộc gặp gỡ
Akhông còn được tham chiếu, sau đó giải phóng nó trong giai đoạn "quét". Thread 1đánh thức và cố gắng sử dụngA(đã đọc từVbước 2) bằng cách đánh dấu nó là root. Và thất bại , vìAkhông còn tồn tại.
Vậy, làm thế nào để xử lý việc này?
Có Thread 2thể đánh dấu đối tượng được thay thế Abằng cờ không loại bỏ đặc biệt (cờ tương tự được sử dụng cho các đối tượng mới được phân bổ). Nhưng khi nào nên gỡ cờ này? Tất nhiên Thread 1có thể làm điều đó. Nhưng Thread 2không biết gì về Thread 1, và do đó không thể chắc chắn rằng điều này sẽ được thực hiện bao giờ. Điều này có thể dẫn đến Asẽ không bao giờ được giải phóng. Và nếu GC sẽ xóa cờ đó, thì không có gì ngăn cản Ađược xóa khi GC chạy lần thứ hai ...
Các mô tả về trình thu gom rác quét và quét rác nhanh chóng mà tôi đã đọc chỉ đề cập rằng đối tượng được thay thế sẽ được "tô màu xám". Nhưng không có bất kỳ chi tiết cụ thể. Một liên kết đến một mô tả chi tiết hơn về giải pháp sẽ được đánh giá cao.