会话在几个servlet之间是否存在同步问题



例如,用户可能访问一个servlet,而该servlet有一系列关于会话的操作,这些操作可能需要一些时间。同时,用户打开另一个窗口并访问另一个关于会话的servlet。由于这两个servlet由同一用户访问,因此它们使用相同的会话变量。因此,我认为存在同步化问题。

如果存在这样的问题,使用同步块是否足以解决问题?(我认为同步块只能在同一个线程中处理事情。)

会话本身是线程安全的。但这并不意味着在没有任何同步的情况下使用它会导致正确的行为。这只意味着,如果由多个线程访问,会话将正确运行。

例如,假设您同时执行以下代码:

Integer visitCount = (Integer) session.getAttribute("visitCount");
visitCount = Integer.valueOf(visitCount.intValue() + 1);
session.setAttribute("visitCount", visitCount);

并且假设visitCount的原始值为0。最终结果可能是2(预期值),也可能是1。实际上,两个线程都可以读取当前值conncurrent(0),然后将其递增到1,并将其存储在会话中。

类似地,如果在会话中存储一个线程不安全的对象(例如HashMap),并且两个线程同时使用该HashMap,则可能会看到不稳定的行为。

与每个多线程程序一样,您必须在必要时使用适当的同步机制,和/或使对象线程安全。但这是整本书的主题。我建议在实践中使用Java并发

相关内容

最新更新