Я знаю, что такое WeakReference
, и я прочитал его документацию, множество блогов и тем SO. Однако мне до сих пор неясно, может ли на самом деле произойти следующий поток.
- объект
X
, на который имеется сильная ссылкаstrRef
и слабая ссылкаweakRef
strRef
очищается в случайном потокеweakRef
разыменовывается в случайном потоке- ссылка, полученная на предыдущем шаге, назначается
strRef
Есть много дискуссий о том, как слабые ссылки очищаются при сборке мусора, но, насколько мне известно, сборка мусора не происходит после каждой очистки ссылок. Следовательно, похоже, что слабодоступный объект потенциально может быть «воскрешен» на шаге №3 выше, если сборка мусора не произошла между этапами №2- №3.
Такое состояние гонки очень неудобно и даже опасно, поэтому я думаю, что должно быть что-то, что этому препятствует, но здесь я хочу быть полностью уверенным.
Итак, существует ли спецификация, которая гарантирует, что объекты со слабыми ссылками не могут быть воскрешены, и есть ли какие-либо предостережения, связанные с многопоточностью?
WeakReference
илиSoftReference
предотвратит сборщик мусора указанногоObject
до тех пор, пока снова не останется сильных ссылок. Фактически, это та самая причина, по которойPhamtomReference
не заслуживает уважения. Это не состояние гонки и не опасно. Это только неудобно, если вы не понимаете, как это работает - это то, как это должно работать. - person Boris the Spider   schedule 20.12.2017