Spring:单例/会话范围和并发性

2024-03-04

Spring bean 的单例/会话范围是否要求对其所有字段的访问必须同步?通过“synchronized”关键字或使用“java.util.concurrent”包中的一些类来表示。

例如,这段代码不是线程安全的吗? (复制/粘贴自here http://vraptor.caelum.com.br/documentation/vraptor3-ten-minutes-guide/):

@Component
@SessionScoped
public class ShoppingCart {
    private List<Product> items = new ArrayList<Product>();

    public List<Product> getAllItems() {
        return items;
    }

    public void addItem(Product item) {
        items.add(item);
    }
}

当你使用singleton从 Spring 容器的范围来看,您指示从容器检索 bean 的所有线程都将使用相同的实例。因此,在这种情况下,项目的状态列表在线程之间共享且可修改,您必须同步对列表的访问,以保护您的应用程序免受ConcurrentModificationException.

然而,Spring 的通常做法是使用无状态对象构建应用程序,这些对象的状态不会在应用程序的整个生命周期中发生变化。

如果是session在范围内,您可能不太可能看到并发问题,因为该 bean 只能由当前登录的用户访问。但是,(至少在 Web 上)可能会在同一个会话中收到多个请求,在这种情况下,您需要采取与单例 Bean 相同的预防措施。

同样,保护自己的最佳方法是尽量使您的 bean 保持无状态。如果您有一个需要状态的 bean,您应该考虑使用prototype范围,每次从容器中检索 bean 的新实例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring:单例/会话范围和并发性 的相关文章

随机推荐

  • 使用包含单行分区的 Cassandra 表是一种不好的做法吗?

    假设我有一张这样的桌子 CREATE TABLE request transaction id text request date timestamp data text PRIMARY KEY transaction id 据我了解 tr
  • PHP 包含绝对路径

    我的网站上有一个名为 basePath 的变量 其设置为 basePath Systems dgw 我在所有 css js 和图像标签上使用它 为了更好的可见性而缩短 我对这些包含没有任何问题 它们在我所在的任何文件和文件夹中都可以正常工作
  • pip 安装错误:SyntaxError:语法无效

    尝试在 CentOS6 上安装 virtualenv requests 或 pex 时 pip install 不起作用 我使用的是 python2 6 和 pip 9 0 1 谁能告诉我为什么会发生这种情况 pex build root
  • 如何获取点击了哪个按钮?

    我想在单击特定按钮时检查某些条件 该怎么做 document ready function var prm Sys WebForms PageRequestManager getInstance prm add initializeRequ
  • Android 数据绑定构建错误:[数据绑定插件]:无法设置数据绑定

    我正在使用 Google 的 Android 数据绑定库 我曾经使用过该库 现在 似乎 某些东西 发生了变化 并且给数据绑定库带来了问题 我被一个非常普遍的错误所困扰 该错误被证明很难调试 data binding plugin faile
  • Kafka连接消费者引用偏移量并存储在消息中

    如果我使用 kafka connect 来消费消息并存储到 s3 使用 kafka connect s3 连接器 我是否可以将消息偏移量与事件负载一起存储 我希望使用这些数据对消息进行一些排序 并检查是否存在任何间隙或检查我收到的消息中是否
  • 如何在 iOS 中的 TableView 中添加工具栏

    我正在构建一个简单的笔记应用程序 我想在 TableView 的底部添加一个静态栏 例如 我想添加一个帮助按钮 我怎样才能只对我的 TableView 执行此操作 So far 我通过情节提要添加了一个工具栏 但这使得它粘在最后制作的 ta
  • 使用 $compile 测试 ng-if

    我试图通过针对预定义范围编译视图并运行 scope digest 来测试我的模板之一中的 ng if 我发现无论我的条件是真还是假 编译的模板都是一样的 我希望编译后的 html 在 false 时删除 ng if dom 元素 befor
  • 将“pip install”分解为较小的步骤,以便我可以在安装之前编辑包

    我对 pip 的熟悉最终使我能够执行以下操作 pip install pip uninstall 和 pip list 将我想要安装的包的名称作为单个参数 到目前为止 这种有限的知识使我能够安装大多数简单的软件包 有时 如果幸运的话 我什至
  • 并行化字典理解

    我有以下功能和字典理解 def function name params results fits open name
  • 无法让 Jetty 扫描带注释的类

    我有一个带有嵌入式码头服务器的应用程序 我像这样启动它 放置在 main 中并使用 eclipse 启动 Server server new Server port WebAppContext context new WebAppConte
  • 从 couchbase 存储桶复制到 Elasticsearch 索引时出现问题?

    此问题似乎与在 couchbase 中使用 XDCR 有关 如果我有以下简单的对象 1 name Mark age 30 2 name Bill age forty 并设置一个elasticsearch索引 curl XPUT http l
  • 如何使用 Firestore 更新“对象数组”?

    我目前正在尝试 Firestore 但我陷入了一些非常简单的事情 更新数组 又名子文档 我的数据库结构非常简单 例如 proprietary John Doe sharedWith who email protected cdn cgi l
  • 绑定到“模型”的集合超出了 MvcOptions.MaxModelBindingCollectionSize (1024)

    当向控制器提交超过 1024 个项目的数组 当前为 2 500 个项目 时 我遇到异常 您可以提交的项目数量似乎有 1024 件的最大限制 它似乎是在 MvcOptions 中设置的 但是我正在使用 Net Core 3 0 并使用端点路由
  • 将 Java 数组中任意范围的元素设置为 null 的最快方法是什么?

    我知道我可以简单地迭代start to end并清除这些细胞 但我想知道是否有可能以更快的方式 也许使用 JNI edSystem arrayCopy 如果我猜对了 您需要使一个数组或包含对象引用的数组的子范围无效 以使它们符合 GC 的条
  • 按类型限制 ElasticSearch 聚合?

    如何针对特定类型执行 ElasticSearch 聚合 我意识到您可以在请求 URL 中指定索引和 或类型 但我想对两种不同的类型执行聚合 谢谢你 您可以按类型过滤聚合 然后使用子聚合 例如 aggs Test 1 filter type
  • doxygen 不显示静态函数和公共函数之间的依赖关系

    你好 我正在尝试使用 doxygen 记录我的 C 代码 问题是静态函数和公共 私有函数之间的依赖关系没有显示出来 其中 公共 私人之间的那些正在正确显示 有人可以在这件事上帮助我吗 将配置和一些示例代码粘贴到此处 Project rela
  • 出现错误 ORA-00909:参数数量无效

    CREATE VIEW ITCC release testcase count AS SELECT CONCAT rtm requirement id tct release id AS id rtm requirement id AS r
  • PHP stmt 准备失败但没有错误

    我正在尝试准备 mysqli 查询 但它默默地失败而没有给出任何错误 db hostname test com db database dbname db username db user db password password db n
  • Spring:单例/会话范围和并发性

    Spring bean 的单例 会话范围是否要求对其所有字段的访问必须同步 通过 synchronized 关键字或使用 java util concurrent 包中的一些类来表示 例如 这段代码不是线程安全的吗 复制 粘贴自here h