java - 阻塞对象属性

标签 java multithreading concurrency javafx

我编写了一个小类,如果值为 null,则该类会阻塞方法。由于某种原因,它抛出一个 StackOverflowError,我做错了什么?

public class BlockingObjectProperty<T> extends SimpleObjectProperty<T> {
    public T get() {
        if (super.get() == null) {
            addListener(((observableValue, t, t1) -> {
                synchronized (this) {
                    notifyAll();
                }
            }));
            synchronized (this) {
                try {
                    wait();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e.getMessage(), e);
                }
            }
        }
        return super.get();
    }
}

这是我的测试代码:

BlockingObjectProperty<String> blockingObjectProperty = new BlockingObjectProperty<String>();
new Thread(){
    public void run(){
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        blockingObjectProperty.set("hello world");
    }
}.start();
System.out.println(blockingObjectProperty.get());

这是异常的片段:

Exception in thread "main" java.lang.StackOverflowError
    at com.sun.javafx.binding.ExpressionHelper$SingleChange.<init>(ExpressionHelper.java:144)
    at com.sun.javafx.binding.ExpressionHelper.addListener(ExpressionHelper.java:69)
    at javafx.beans.property.ObjectPropertyBase.addListener(ObjectPropertyBase.java:87)
    at com.neonorb.commons.property.BlockingObjectProperty.get(BlockingObjectProperty.java:8)
    at javafx.beans.binding.ObjectExpression.getValue(ObjectExpression.java:50)
    at com.sun.javafx.binding.ExpressionHelper$SingleChange.<init>(ExpressionHelper.java:152)
    at com.sun.javafx.binding.ExpressionHelper$SingleChange.<init>(ExpressionHelper.java:144)
    at com.sun.javafx.binding.ExpressionHelper.addListener(ExpressionHelper.java:69)
    at javafx.beans.property.ObjectPropertyBase.addListener(ObjectPropertyBase.java:87)
    at com.neonorb.commons.property.BlockingObjectProperty.get(BlockingObjectProperty.java:8)
    at javafx.beans.binding.ObjectExpression.getValue(ObjectExpression.java:50)
    at com.sun.javafx.binding.ExpressionHelper$SingleChange.<init>(ExpressionHelper.java:152)
    at com.sun.javafx.binding.ExpressionHelper$SingleChange.<init>(ExpressionHelper.java:144)
    at com.sun.javafx.binding.ExpressionHelper.addListener(ExpressionHelper.java:69)
    at javafx.beans.property.ObjectPropertyBase.addListener(ObjectPropertyBase.java:87)
    at com.neonorb.commons.property.BlockingObjectProperty.get(BlockingObjectProperty.java:8)

最佳答案

当您调用 addListener 时,JavaFX 会询问属性的当前值(在 ExpressionHelper.java:152 中),并再次调用 getValue()。然后 - 由于该值仍然为空 - 您添加另一个监听器,依此类推。

关于java - 阻塞对象属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32716120/

相关文章:

java - 用于生成 webservice war 文件的 Weblogic Ant JWSC 任务

ruby - 如何引用当前线程

c++ - OpenCV GPU Farneback 光流在多线程中运行不佳

java - 为什么在同步块(synchronized block)外调用 notifyAll() 时会引发 IllegalMonitorStateException?

java - RxJava为项目列表创建可观察链

java - 打破 ArrayList 并在 Struts 1 中显示

java - 有没有办法停止读取特定字符(*)之后的行

JAVA实时控制台-控制线程

java - 在线程安全类中返回一个对象

c++ - 这会是一个僵局吗?