1

如果我有一个共享对象,它会保存在 httpsession 中。

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

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

是否有机会,由 request2 呈现的页面上的数据会过时(没有完成 ajax 或其他异步操作)?

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

4

2 回答 2

6

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

用户可以打开多个选项卡/窗口并发出近乎同时的请求。这些请求将以不确定的时间和顺序进行处理。

于 2012-08-15T15:48:23.827 回答
4

您没有在线程方面提供足够的相关信息来准确回答您的问题,但让我给您一些一般性警告。

  1. 为了解决由数据竞争引起的问题,不需要真正的并发访问——来自多个线程的访问就足够了,即使有时相隔几秒或几分钟。

  2. 您可能遇到的问题源于一个线程对其他线程的更改的可见性。在读取和写入之间没有happens-before关系的情况下,JVM 不需要将任何更改从本地缓存/线程本地存储传播到主内存,反之亦然:读取线程不需要从主内存中提取新数据.

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

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

于 2012-08-15T16:00:12.957 回答