例如,用户可以访问servlet,并且该servlet有一系列关于会话的操作,这可能需要一些时间。同时,用户打开另一个窗口并访问另一个关于会话的servlet。由于这两个servlet由同一个用户访问,因此它们使用相同的会话变量。所以我认为往往存在同步问题。
如果存在这样的问题,是否正在使用同步块来解决问题? (我认为sychronized block只能处理同一个线程中的事情。)
答案 0 :(得分:2)
会话本身是线程安全的。但这并不意味着在没有任何同步的情况下使用它会导致正确的行为。它只表示如果多个线程访问会话将正常运行。
例如,假设您同时执行以下代码:
Integer visitCount = (Integer) session.getAttribute("visitCount");
visitCount = Integer.valueOf(visitCount.intValue() + 1);
session.setAttribute("visitCount", visitCount);
并假设visitCount
的原始值为0.最终结果可能是2(预期值),或者它可能是1.实际上,两个线程都可以同时读取当前值(0),然后都将它增加到1,并将它存储在会话中。
类似地,如果在会话中存储线程不安全的对象(例如HashMap),并且两个线程同时使用此HashMap,则可能会看到不稳定的行为。
与每个多线程程序一样,必要时必须使用适当的同步机制,和/或使对象具有线程安全性。但这是整本书的主题。我建议 Java Concurrency in practice 。