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

我知道调用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(); } } 

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

Upshot:模拟问题

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

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

主线程上没有问题

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

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

其他主题

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

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

  • VaadinSession对象的access方法
  • UI对象的access方法

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

手动锁定不需要的

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


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

如果您尝试从另一个后台线程访问Vaadin Session,那么您需要访问锁定,否则您实际上不需要。 Vaadin Service将自动为您执行此操作,即,在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(); } }); 

希望这对你有所帮助