例如,用户可能访问一个 servlet,而该 servlet 有一系列关于 session 的操作,这可能需要一些时间。与此同时,用户打开另一个窗口并访问另一个关于 session 的 servlet。由于这两个 servlet 由同一用户访问,因此它们使用相同的 session 变量。所以我认为往往存在同步问题。
如果存在此类问题,使用同步块(synchronized block)是否足以解决问题? (我认为sychronized block只能处理同一个线程中的东西。)
最佳答案
session 本身是线程安全的。但这并不意味着在没有任何同步的情况下使用它会导致正确的行为。这仅意味着 session 在被多个线程访问时会正确运行。
例如,假设您同时执行了以下代码:
Integer visitCount = (Integer) session.getAttribute("visitCount");
visitCount = Integer.valueOf(visitCount.intValue() + 1);
session.setAttribute("visitCount", visitCount);
并假设visitCount
的原始值为0。最终结果可能是2(期望值),也可能是1。实际上,两个线程都可以同时读取当前值(0 ), 然后将其递增到 1,并将其存储在 session 中。
同样,如果您在 session 中存储一个线程不安全的对象(例如 HashMap),并且两个线程同时使用此 HashMap,您可能会看到不稳定的行为。
与每个多线程程序一样,您必须在必要时使用适当的同步机制,和/或使您的对象线程安全。但这是整本书的主题。我会推荐 Java 并发实践。
关于java - session在几个servlet之间是否存在同步问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12444592/