파이널 라이저에서 관리되는 리소스를 정리해야하거나 클린업이 필요한 스레드 안전한 방식으로 어딘가에 기록해야한다고 가정합니다. 내가 이해하는 바에 따르면, 파이널 라이저에서 자물쇠를 가져가는 것은 엄격히 말하지만 연동 클래스는 어떨까요? 이것은 안전하며 교착 상태가 발생하지 않습니까?Interlocked를 Finalizer에서 사용할 수 있습니까?
static int deadentries;
~Item() { Interlocked.Increment(ref deadentries); }
public static T Get(int id, Action<T> init) {
T ret;
WeakReference<T> tref;
if (cache.TryGetValue(id, out tref)) {
if (tref.TryGetTarget(out ret)) return ret;
else Interlocked.Decrement(ref deadentries);
}
if (deadentries * 2 > cache.Count) {
// etc. etc.
또한,이 보장 된 행동이나 단지 구현 세부이며, 모든 파이 나라가 하나 개의 스레드에서 실행되는 것 같다? 그리고 세부 사항이라면 자물쇠가 결코 다른 곳으로 옮겨지지 않는다면 finalizers 내부의 자물쇠를 획득하는 것이 좋습니다 (예 : 자물쇠가없는 대기열에서 작업을 푸시).