java - session在几个servlet之间是否存在同步问题?

标签 java session servlets synchronization

例如,用户可能访问一个 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/

相关文章:

java - 如何强制 Java 在 Windows 上使用 Unix 文件分隔符?

java - 如何使用 java 8 的 forEach 内部的方法引用来测试谓词

java - 为什么 Bounded 类型参数出现 "java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to"错误而不是 Formal 类型参数?

php - 如何从 SQL 中选择多条记录并插入到 Session 中

Spring mvc Controller 处理所有请求,不应该那样做

java - 映射getOrDefault VS getOrUseSupplier

javascript - 是否可以将集合或其他数据结构存储为快速 session 中的 session 变量?

java - 将错误消息作为 JSON 对象发送

java - 获取 JSP servlet session ,返回空值

php - 将不同的变量插入$_SESSION