在Vaadin 7中调用VaadinSession getAttribute时需要锁定

Kra*_*ayo 3 java multithreading vaadin vaadin7

我知道调用setAttribute(link)时有必要,但getAttirbute呢?

它是否正确?

public Object getMyAttribute() {
    return VaadinSession.getCurrent().getAttribute("myAttribute");
}
Run Code Online (Sandbox Code Playgroud)

还是需要锁定?

public Object getMyAttribute() {
    try {
        VaadinSession.getCurrent().getLockInstance().lock();
        return VaadinSession.getCurrent().getAttribute("myAttribute");
    } finally {
        VaadinSession.getCurrent().getLockInstance().unlock();
    }
}
Run Code Online (Sandbox Code Playgroud)

Bas*_*que 5

添加到Patton的答案.虽然我不是这方面的专家,但是在仔细阅读文档并阅读RolandKrüger的这篇文章后,我发表了我的理解.

Upshot:模拟问题

虽然我不知道你问题的确切答案,但我认为这个问题没有实际意义.

让Vaadin 7.1及更高版本自动处理锁定.该文档称自动锁定路径优于手动锁定.

主线程上没有问题

如果VaadinSession在通常的主要Vaadin用户界面线程中访问from,则不需要显式锁定.在主线程中工作时,Vaadin会根据需要自动锁定VaadinSession.

您的所有应用程序状态都存储在该会话对象中,因此Vaadin会定期访问和保护该会话.

其他主题

如果从后台线程从您启动的线程访问VaadinSession,则锁定只是一个问题.

即使在这种情况下,Vaadin提供了一对选项,如果您将Runnable传递给这些"访问"方法中的任何一个,则会自动处理锁定:

如果您的代码仅影响VaadinSession而不触及任何UI对象(用户界面,布局,窗口小部件组件等),那么请使用第一个,VaadinSession.access().另一方面,如果您的代码影响任何UI对象以及直接寻址VaadinSession,请使用第二个,UI.access().

手动锁定不需要

因此,虽然您可以在访问VaadinSession期间管理锁定,但只有在后台线程中并且出于某种原因您不想调用任何access一种方法时才需要这样做.但我无法想象任何这样的理由.


有关我所做的更多讨论和详细图表,请参阅此类似问题,如何将数据放入会话变量并在vaadin中的不同页面中获取数据?.