【问题标题】:Show JSF user Message when Synchronized Backing bean method is in use [duplicate]使用同步支持 bean 方法时显示 JSF 用户消息 [重复]
【发布时间】:2017-06-10 08:21:34
【问题描述】:

我在 JSF View Scoped Bean 中有一个方法 doSomething(int param),它只能由一个线程使用,当从另一个线程(另一个用户)调用此方法时,它必须显示用户消息,同时它仍在由第一个线程(第一个用户)使用。

我知道我必须使用“同步”,但如何实现呢?以及如何在消息使用时向调用它的用户显示消息?

提前感谢您的帮助。

【问题讨论】:

  • synchronized 不是为了这个。

标签: multithreading jsf synchronization


【解决方案1】:

在我看来,无论如何你试图防御的东西是不可能的。

根据 JSF 规范,@ViewScoped 注释 bean 仅存在于一个用户(会话)的上下文中,并且仅在使用特定视图时存在。 当另一个用户(甚至是来自不同浏览器/选项卡的同一用户)进入同一个视图时,将创建一个新的 bean 实例。

视图(@ViewScoped):视图范围在用户交互期间持续存在 具有 Web 应用程序的单个页面(视图)。

@ViewScoped 线程安全可能出现问题的唯一情况是应用程序未实现任何客户端 ajax 请求队列,这是您应该考虑在 bean 中放置一些同步块的唯一情况。

如果不是这种情况,那么只有 @SessionScoped 和 @ApplicationScoped bean 应考虑线程安全。

【讨论】:

  • 感谢您的回复。经过一番搜索并根据您和 BalusC 的回答,我希望我的以下理解是正确的:对于 View Scoped Beans(即 Request Scoped Beans),关键字“synchronized”没有任何作用,因为会有一个新实例每次新会话(可能是新用户)访问同一视图时将创建的视图 bean。
  • 事实上,由于时间限制,我无法重构应用程序的现有代码以更好地管理范围(我的意思是考虑 Session 或 Application Scope 以确保线程安全)。因此,作为防止多个用户同时使用相同方法的解决方案:我正在考虑使用布尔类型的静态标志,并在方法的开头通过此标志检查相关方法是否是否正在使用,如果没有,则标志设置为真,完成该方法后,应再次将其设置为假。也许不是一个干净的解决方案。请问你怎么看?
  • 不,不要以这种方式同步您的代码。使用标准的同步标识符,或者如果您想更详细地使用 java.util.concurrent 包的功能。如果有人在我的应用程序中设置并发标志,他肯定会通过我的审查。
猜你喜欢
  • 1970-01-01
  • 2011-04-04
  • 2015-07-03
  • 2012-08-03
  • 2016-10-21
  • 2017-07-03
  • 2017-12-02
  • 2016-10-15
  • 2018-08-15
相关资源
最近更新 更多