共享对象中是否存在竞争条件?

时间:2012-08-15 15:39:26

标签: java java-ee servlets

如果我有一个共享对象,那就是在httpsession中保存。

如果我不经时修改它而没有任何并发​​更改(例如我的客户信息在会话中保存,并且一次只能为同一个用户访问(此信息的所有者),是否有机会某种与多线程有关的问题?

流程示例: 对象保存在会话中(线程1)。 对象由线程修改,即为request1服务(用户更改了他的数据并将其保存在会话中)。 对象由线程修改,即服务于request2(用户打开包含其用户信息的页面)。

是否有可能,request2呈现的页面上的数据将是陈旧的(没有ajax或其他异步内容完成)?

UPD: 我的问题是,感觉就像它是对共享资源的顺序访问一样,它存在于httpsession中(绑定到具体的登录用户)。这是主要原因,你不想使用易失性东西或同步。

2 个答案:

答案 0 :(得分:6)

当然 - 任何时候多个线程都可以访问相同的数据,就有可能出现问题。

用户可以打开多个标签/窗口并进行近乎同步的请求。这些请求将以非确定的时间和顺序进行处理。

答案 1 :(得分:4)

你没有提供足够的线索相关信息来准确回答你的问题,但是让我给你一些警告。

  1. 为了体验源于数据竞赛的问题,即使在以秒或分钟分隔的时刻,也不需要从多个线程进行真正的并发访问即可。

  2. 您可以遇到的问题源于一个线程对其他线程的更改的可见性。如果读写之间没有happens-before关系,则JVM不需要将任何更改从本地缓存/线程本地存储传播到主内存,反之亦然:读取线程不需要提取新鲜内容来自主存储器的数据。

  3. 根据您所拥有的确切代码,有时即时编译器甚至可以优化整个读取操作,注意到第一次读取并永久缓存该值就足够了(因为有与该读取没有happens-before的关系。

  4. 总之,您肯定需要一些方法来确保从您的写入到读取的happens-before关系。这完全取决于您的代码的细节。