gpt4 book ai didi

Java 8 lambda 弱引用

转载 作者:搜寻专家 更新时间:2023-11-01 03:23:21 26 4
gpt4 key购买 nike

我创建了一个名为 Foo 的对象。当我创建一个名为 Action 的 lambda 或方法引用时,Action 对象包含对 Foo 的引用。
我将 Action 传递给另一个类(class)。但是如果我将它作为弱引用持有,它会立即获得 gc,因为没有人存储对 Action 的另一个引用。
但是,如果我将其作为强引用,则 Foo 不能被 gc,因为 Action 持有对它的引用。
所以内存泄漏发生了,我想阻止它。

我的问题是:如何在不阻止 Foo 的 gc 的情况下保留对 Action 的引用。

例子:

Interface Action {
void invoke();
}

Class Foo() {
public void someMethod() {
....
}
}

Class Holder() {
WeakRefrence<Object> foo;
public Action action;

void register(Object source, Action a) {
foo = new WeakReference(source);
??? how can i hold the action without prevent source to gc able.
}
}


main() {
Holder holder = new Holder();
Foo foo = new Foo();
Action action = foo::someMethod;

holder.register(foo,action);
action = null;
System.gc();
//only the holder store reference to action.
//if i store in holder as weak reference i cannot invoke it any more cause it get gc.

//foo = null;
//System.gc();
//if i grab action in holder as strong refrence the foo cant be gc cause action hold refernce to it.

holder.action.invoke();
}

最佳答案

您必须将操作 与弱引用目标 分开。您应该始终牢记,lambda 仅用于指定行为

class Foo {
public void someMethod() {
System.out.println("Foo.someMethod called");
// ....
}
}

class Holder<T> extends WeakReference<T> {
private final Consumer<T> action;
Holder(Consumer<T> action, T target) {
super(target);
this.action=action;
}
public void performAction() {
T t=get();
if(t!=null) action.accept(t);
else System.out.println("target collected");
}
}

class Test {
public static void main(String... arg) {
Foo foo = new Foo();
Holder<Foo> holder = new Holder<>(Foo::someMethod, foo);
System.gc(); // we are still referencing foo
holder.performAction();
foo = null;
System.gc(); // now we have no reference to foo
holder.performAction();
}
}

关于Java 8 lambda 弱引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22779413/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com