Информация об изменениях

Сообщение Re[3]: Замыкания и Reference Counting от 19.10.2024 18:32

Изменено 19.10.2024 18:34 vsb

Re[3]: Замыкания и Reference Counting
Здравствуйте, Worminator X, Вы писали:

vsb>>С замыканиями очень просто создать циклическую ссылку. Reference counting будет работать, но нужно не забывать руками рвать циклы. С GC это всё, конечно, намного проще.


WX>Обычно для этого захватываемые переменные (поля объекта-замыкания) делают неизменяемыми, например, такое долгое время было в Java.


В Java и сейчас так (та ещё дурость).

WX>В результате присвоить им значение функции с замыканиями нельзя, и циклические ссылки невозможны.


Да прям уж. Поле неизменяемое, а содержимое изменяемое.

class Pointer {
    Object value;
}

final var pointer = new Pointer();
Runnable runnable = () -> System.out.println(pointer.value);
pointer.value = runnable;


WX>Там, где зачем-то возможны (сложно придумать такую задачу), скорее всего, без GC не обойтись.


Да это везде сплошь и рядом.
Re[3]: Замыкания и Reference Counting
Здравствуйте, Worminator X, Вы писали:

vsb>>С замыканиями очень просто создать циклическую ссылку. Reference counting будет работать, но нужно не забывать руками рвать циклы. С GC это всё, конечно, намного проще.


WX>Обычно для этого захватываемые переменные (поля объекта-замыкания) делают неизменяемыми, например, такое долгое время было в Java.


В Java и сейчас так (та ещё дурость).

WX>В результате присвоить им значение функции с замыканиями нельзя, и циклические ссылки невозможны.


Да прям уж. Поле неизменяемое, а содержимое изменяемое.

final var reference = new AtomicReference<>();
Runnable runnable = () -> System.out.println(reference.get());
reference.set(runnable);


WX>Там, где зачем-то возможны (сложно придумать такую задачу), скорее всего, без GC не обойтись.


Да это везде сплошь и рядом.