Что такое легко достижимый объект?

Я пытаюсь изучить значение мягкой ссылки через эту статью "Мягкие ссылки в Java":

https://www.baeldung.com/java-soft-references

Моя проблема в понимании этой статьи состоит в том, что она определяет термин "мягкая ссылка" через термин "легко достижимый объект", но я не знаю, что означает "легко достижимый объект".

То есть объект в куче либо имеет ссылку на него, либо нет, верно?

Ссылка либо указывает на действительный объект, либо равна нулю, верно?

Когда объект становится "мягко достижимым"?

или я все неправильно понял?

2 ответа

Решение

Сильная ссылка, мягкая ссылка и слабая ссылка.

Student strongReference = new Student(); 

WeakReference<Student> weakReference = new WeakReference<>(strongReference);

так же

Student strongRef = new Student();
SoftReference<Student> softReference = new SoftReference<>(strongRef);

Во время сборки мусора, если объект в куче имеет сильную ссылку на него, он выживает, если у него нет сильной ссылки, но есть Weak Reference, то он не выживет. Он используется для предотвращения утечки, когда объекты передаются вне контекста менеджера жизненного цикла.

Soft Reference подобны слабым ссылкам, но они выдерживают цикл сборки мусора до тех пор, пока памяти не станет достаточно.

Объект легко доступен, если нет сильных ссылок и есть Soft References. Поскольку объект, имеющий только слабую ссылку, пригоден для сборки мусора, и, с другой стороны, объект, имеющий только мягкую ссылку, более пригоден для выживания при сборке мусора (по сравнению со слабой ссылкой), следовательно,

  1. Объект, который не имеет сильной ссылки и имеет только мягкую или слабую ссылку, легко доступен

  2. Объект, имеющий только Weak Reference и не имеющий сильных или мягких ссылок, доступен еженедельно

  3. Объект с по крайней мере одной сильной ссылкой с мягкими или слабыми ссылками или без них является строго доступным.

Оба приведенных ниже случая Объект в куче мягко достижим.

Student stRef = new Student();
SoftReference <Student> sfRef = new SoftReference<>(stRef);
stRef = null;

Или же

SoftReference <Student> sfRef = new SoftReference<>(new Student());

Чтобы использовать объект get() метод используется, но мы знаем, что он дает вам сильную ссылку.

Предположим, у вас есть

Student strongReference = new Student(); 

SoftReference<Student> softReference = new SoftReference<>(strongReference);
 strongReference = null; // object in heap is softly reachable now
 Student anotherStrongReference = softReference.get();
 if(anotherStrongReference != null){
      // you have a strong reference again
 }

Поэтому избегайте присвоения ненулевого объекта, возвращаемого из get() метод Weak или Soft ссылается на статические переменные или переменные экземпляра, иначе он просто побеждает использование любого из них. Используя любой из них, лучше всего хранить статическую переменную или переменную экземпляра, если это необходимо, в виде слабой или мягкой ссылки. Когда вам нужно использовать get() проверьте не ноль и используйте только как локальный переменный. переходите к другим методам, если это возможно, только слабая или мягкая ссылка.

Различие между Weak Reference и Soft Reference хорошо объяснено в различных ссылках, одна из таких ссылок: /questions/31615584/v-chem-raznitsa-mezhdu-softreference-i-weakreference-v-java/31615596#31615596

PS Ссылки на объекты типа Weak Reference и Soft Reference имеют строгие ссылки, это обернутый объект, который слабо или мягко доступен, если нет сильной ссылки (объект можно получить с помощью get() ). WeakReference <Student> weakRefOfStudent = new WeakReference<>(new Student());

weakRefOfStudent сильная ссылка типа WeakReference.java и объект в куче типа Student доступен еженедельно. К этому объекту можно получить доступ weakRefOfStudent.get(), который может быть или не быть нулевым, если он был собран мусором или нет.

Это просто чтобы прояснить сомнения, которые могут возникнуть.

Я думаю, что связанная статья объясняет это довольно хорошо в первых предложениях. Мягкая ссылка и легко достижимый объект используются здесь как синонимы.

Таким образом, правильный ответ на ваш вопрос будет: "Мягко достижимый объект - это объект, на который ссылаются только мягкие ссылки".

Что касается природы мягких ссылок, ну, статья объясняет это лучше, чем я мог бы в некоторых параграфах здесь.

Другие вопросы по тегам