Подтвердить что ты не робот

Верно ли, что Java неявно определяет ссылки на объекты, используемые в классах?

После чтения книг, занимающихся серфингом в сетях относительно типа ссылок на Java, у меня все еще есть некоторые сомнения (или я, возможно, неправильно интерпретировал концепцию).
Это было бы большой помощью для меня, если бы кто-нибудь уяснил мои сомнения.

Позвольте мне привести пример класса, содержащего переменные класса, переменные экземпляра и локальные переменные.

public class Test {
  public static ArrayList<String> listCommon = new ArrayList<String>();
  private HashMap<String, String> mapInstance;

  public Test() {
    mapInstance = new HashMap<String, String>();
  }

  public void doSomething(String key) {
    ArrayList<String> local = new ArrayList<String>();
    if(key != null){
      local.add(mapInstance.get(key));
    }

    System.out.println("Value is added in instance Map: ", mapInstance.get(key));
  }
}

Мой вопрос: 1. являются listCommon (статическая переменная) и mapInstance (переменная экземпляра) Сильная ссылка на сборщик мусора?
2. Является ли переменная local (определена и используется в методе) Слабая ссылка?
3. Как появилась ссылка Phantom reference и Soft reference?

4. ИЛИ не более 3 понятий недействительны; означает, что Java определяет ссылки только в том случае, если вы явно использовали тип, определенный в пакете java.lang.ref?

Любая помощь будет отличной для меня.

4b9b3361

Ответ 1

  • are listCommon (статическая переменная) и mapInstance (переменная экземпляра) Сильная ссылка на сборщик мусора?

Они сильные ссылки, да.

  • Является ли переменная локальной (определенной и используемой в методе) слабой ссылкой?

Нет, это локальная переменная, поэтому она является переменной, поэтому она по-прежнему является сильной ссылкой.

  • Как появилась ссылка Phantom и Soft reference?

Если вы их используете. Если вы их не используете, вам не нужно беспокоиться о них. Они предназначены для написания различных видов кешей.

  • ИЛИ выше 3 понятия недействительны; означает, что Java определяет ссылки только в том случае, если вы явно использовали тип, определенный в java.lang.ref пакет?

Ссылочные переменные всегда сильны. Другие виды возникают только тогда, когда вы используете их явно.

Ответ 2

Прочитайте это сообщение в блоге о ссылках на переменные.

** Обновить **

Атомная ссылка - это объект, на который ссылается таким образом, что к нему обращаются атомарно; это означает, что к нему не доступны условия гонки. Например:

class RaceTest {
   static private int count = 0;
   static public void main(String...args) {
      Thread t1 = new Thread(new Runnable() {
         public void run() {
             for (int i=0; i<1000000; i++) {
                 count++;
             }
      });
      Thread t2 = new Thread(new Runnable() {
         public void run() {
             for (int i=0; i<1000000; i++) {
                 count--;
             }
         }
      });

      t1.start();
      t2.start();

      t1.join();
      t2.join();

      System.out.println("Final count (should be 0) = " + count);
   }
}

Появится два потока, которые 1) будут увеличивать count и 2) уменьшат его. Теперь оба потока будут выполняться параллельно, и программа будет ждать, пока оба конца не прекратятся (в точке join). Общей идеей было бы то, что, поскольку оба потока имеют один и тот же цикл (будут зацикливаться на такое же количество времени), каждый будет "отменить" друг друга, и, следовательно, count должно быть 0, но это не так. Зачем? Поскольку, например, t1 может захотеть увеличить переменную, такая операция не является атомарной, но имеет порядок порядка: get, inc, set. Таким образом, могут быть случаи, что даже до выполнения второй операции inc, t2 имел бы доступ к переменной и dec переменную, поэтому t1 имела бы фактически +2 переменную. И наоборот, бессрочно. (Каждый запуск кода создавал бы другое значение.)

Теперь, заменив int на AtomicInteger и используя incrementAndGet() или decrementAndGet(), решит проблему, выделив get, inc, set в одну операцию и устранив условие гонки в коде.

Ответ 3

Ответьте на вопросы:

  • Да, они сильные ссылки. Слабая ссылка определяется с помощью Слабая ссылка Объект.

  • Нет, причина как 1).

  • Phantom Ссылка не применяется в вашем примере. По умолчанию все экземпляры являются сильной ссылкой.

  • Да, вы указываете слабую / phantom ссылку с помощью пакета java.lang.ref. По умолчанию используется сильная ссылка.

Примечание. Возможно, полезно использовать описание Weak Reference.