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

时间:2014-02-14 10:39:10

标签: java multithreading vaadin vaadin7

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

这是对的吗?

public Object getMyAttribute() {
    return VaadinSession.getCurrent().getAttribute("myAttribute");
}

还是需要锁定?

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

2 个答案:

答案 0 :(得分:5)

添加到the answer by Patton。虽然我不是这方面的专家,但是在仔细阅读文档并阅读RolandKrüger的this post后,我会发表我的理解。

Upshot:Moot Question

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

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

主线程上没有问题

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

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

其他主题

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

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

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

手动锁定不需要的

因此,当您可以在访问VaadinSession期间管理锁定时,您只需要在后台线程中出于某种原因而不想调用access方法。但我无法想象有这样的理由。


有关我的更多讨论和groovy diagram,请参阅此类似问题how to put data in session variable and get the data in different page in vaadin?

答案 1 :(得分:2)

如果您尝试从另一个后台线程访问Vaadin Session,那么您需要访问锁定,否则您实际上不需要。 Vaadin服务会自动为您执行此操作,即,当您在vaadin框架调用方法之前在UI上执行某些操作时,框架将锁定会话。

接下来,如果您尝试从另一个线程访问Session变量,那么您必须执行类似这样的操作来访问会话变量。

          UI.getCurrent().access(new Runnable() {

                @Override
                public void run() {

                    Thread thread = new Thread(new Runnable(){
                      //TODO Write your logic to perform some session related action

                     });
                    thread.start();

                }
            });

希望这有助于你