WeakRef semantics

I recently discovered WeakRef can reach its target post-finalization, which I think can lead to a lot of unintended bugs, and was curious where this design choice arose.

Left a comment here, with more details. In brief, Java makes weak references null post-finalization, and .Net provides what they call long and short weak references to cater to each use case.

What are everyone else’s thoughts on this, and are there some common coding patterns people adopt to handle post-finalization reference resurrection?