如何避免竞态条件

3
什么是避免 JSP 中竞态条件的最好方法,同时不会减慢进程速度?我尝试过 isThreadSafe=false synchronized(session)
然而,是否还有其他备选解决方案可用?

相关问题:https://dev59.com/1HI-5IYBdhLWcg3wf4hD https://dev59.com/gnRB5IYBdhLWcg3wc3A0 - McDowell
3个回答

6
一种一刀切的解决方案(例如threadSafe=false)会导致请求逐个执行,这必然会减慢请求处理速度。
为了避免这种情况发生,您需要了解为什么会出现竞争条件,并重新设计架构以避免问题。例如:
- 如果竞争条件在于更新某些共享内存数据结构,则需要在适当的粒度上同步访问和更新数据结构。 - 如果竞争条件在于更新数据库,则需要重构SQL以在适当的粒度上使用事务。
这些只是解决竞争条件问题的可能方案。实际上,您必须自己理解根本原因。

5

这取决于你存在竞态条件的原因。

最简单的想法是不使用全局变量进行写操作。

在仅使用局部变量的方法中执行所有逻辑。

不要在jsp页面中编写任何Java代码,而是调用bean来执行操作。

你做了什么导致竞态条件出现?


1
isThreadSafe=false

这可能会导致性能不佳,因为它使页面访问变成了顺序访问。而且它只会影响一个页面,所以如果您通过另一个页面访问数据,这对您没有任何作用。

synchronized(session)

这并不保证一定会起作用(尽管它在某些服务器上会由于实现的副作用而起作用)。

任何解决方案可能需要更多关于您正在尝试保护的数据和服务器配置的信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接