首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >共享对象中是否存在竞争条件?

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

Stack Overflow用户
提问于 2012-08-15 15:39:26
回答 2查看 247关注 0票数 1

如果我有一个共享对象,则该对象被保存在httpsession中。

如果我不时地修改它而不进行任何并发的更改(例如,我的客户信息是在会话中保存的,并且一次只能对同一个用户(此信息的所有者)访问),那么是否有可能出现与多线程等相关的问题?

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

request2呈现的页面上的数据是否有可能过时(没有ajax或其他异步操作)?

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

EN

回答 2

Stack Overflow用户

发布于 2012-08-15 15:48:23

当然,只要多个线程能够访问相同的数据,就有可能出现问题。

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

票数 6
EN

Stack Overflow用户

发布于 2012-08-15 16:00:12

你还没有给出足够的相关信息来精确地回答你的问题,但让我给你一些一般性的警告。

  1. 为了体验数据竞争产生的问题,不需要真正的并发访问--来自多个线程的访问就足够了,即使在被秒或分钟分隔的时刻也是如此。
  2. 您可以体验到的问题来自一个线程对其他线程的更改的可见性。在读写之间没有happens-before关系的情况下,JVM不需要将从本地缓存/线程本地存储到主内存的任何更改传播到主内存,反之亦然:读取线程不需要从主内存中提取新的数据。
  3. 根据您的确切代码,有时实时编译器甚至可以优化整个读取操作,注意到第一次读取并永远缓存该值就足够了(因为与该读取没有happens-before关系)。

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11972475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档