在访问方法内部使用相同的UI实例

时间:2018-12-13 14:50:43

标签: java concurrency vaadin8

我有一个实现Runnable的类,并提供了其他字段来存储线程的当前自定义UI实例(扩展了UI类)。

在内部调用的run方法中

@Override
public void run() {
    ui.access(() -> ui.getPoolingManager().unregisterPollRequest(this));
}

其中ui是在线程实例化时设置的当前线程的字段。

问题-使用相同的ui实例在labmda内部调用accessgetPoolingManager(自定义方法)时,是否存在一些并发问题?

1 个答案:

答案 0 :(得分:1)

除非PoolingManager本身使用ThreadLocals或类似的我不这么认为。您可以通过访问方法在UI实例上保持锁定,因此访问其他字段/方法毫无问题。

来自documentation:“给定的runnable在持有会话锁的同时执行,以确保对该UI的独占访问。如果会话未锁定,则将获取该锁,并且该runnable立即运行。如果会话当前处于锁定状态,则可运行的对象将在释放该锁定之前运行。”和“请注意,可运行对象可能在其他线程上调用,或者稍后在当前线程上调用,这意味着自定义线程本地执行命令时可能没有期望的值。”