1
假設我需要清理終結器中的一些託管資源,或者至少以線程安全的方式將其記錄在需要清理的地方。根據我的理解,鎖定終結者是嚴格禁止的,但Interlocked類怎麼樣?這是否安全,是否會導致僵局?可以在終結器中使用互鎖嗎?
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.
而且,似乎一切都終結在一個線程中運行,這是有保證的行爲,或只是實現的細節?如果只是一個細節,這是否可以在終結器內部獲取鎖(比如,將任務推入一個無鎖隊列中),前提是鎖永遠不會在其他地方使用?