Ich hätte nicht sagen dürfen „In dem Moment, wo eine weak reference enqueued ist, wurde das Objekt ja schon finalized.“, sondern vielleicht eher sowas wie „In dem Moment, wo eine Weak reference bei get()
ein null
liefert, kann das Objekt ja gefinalized werden“.
Aber der Punkt, auf den ich rauswollte, ist in beiden Fällen der gleiche: Wenn das Ziel darin besteht, zu verhindern, dass ein Objekt GC’d wird, dann ist das if (get()==null)
(genau wie die Queue) ja nur eine Möglichkeit, um festzustellen, dass es … zu spät ist, um das noch zu verhindern.
(Irgendwie habe ich gerade das Gefühl, entweder bei der Frage oder beim Verhalten von *References
was grundsätzlich falsch zu verstehen. Dazu kommt z.B. dass in der Doku steht " An object that is reachable via phantom references will remain so until all such references are cleared or themselves become unreachable.", aber bei meinen Tests eben finalize()
auf einem Objekt aufgerufen wurde, auf das noch eine Phantom Reference existiert, bei dem ich aber nicht clear
aufgerufen habe - sollte das so sein? …)
Was man bräuchte wäre halt ein ganz pragmatisch-altmodisches reference-counting. Aber in Java ist das nicht so einfach. (Websuche liefert eine lib, die sowas macht, aber hier in dieser Form wohl nicht hilfreich…). Und… ich gehe davon aus, dass das wirklich ein Rätsel sein soll. Wenn das Ziel ein echter Anwendungsfall wäre, würde man sich halt eine andere Lösung überlegen.
Schöner wäre natürlich eine passive Konstruktion. Ob das möglich ist kann ich ernsthaft nicht beurteilen.
Eine Schwierigkeit besteht darin, dass man sich in das, was die VM macht, in diesem Fall nicht einklinken kann. Einige Aktionen passieren einfach auf nativer Seite, so dass man auch mit fiesen Tricksereien (überschreiben von Methoden, Unsafe, Reflection) da nicht rankommt…