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:
V
là một biến, lưu trữ một con trỏ tới đối tượngA
.Thread 1
đọcV
và đình chỉ.Thread 2
sửa đổiV
và 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ỡ
A
khô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ừV
bước 2) bằng cách đánh dấu nó là root. Và thất bại , vìA
không còn tồn tại.
Vậy, làm thế nào để xử lý việc này?
Có Thread 2
thể đánh dấu đối tượng được thay thế A
bằ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 1
có thể làm điều đó. Nhưng Thread 2
khô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 A
sẽ 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.