在 Java 中,如果我的集合是只读的,我是否需要将其声明为同步?

2023-12-30

当我的 J2EE web 应用程序启动时,我会一次性填充一个集合。 然后,多个线程可以同时访问它,但只能读取它。

我知道使用同步集合对于并行写入是强制性的,但是我仍然需要它来进行并行读取吗?


通常不会,因为在这种情况下您不会更改集合的内部状态。当您迭代集合时,将创建迭代器的新实例,并且迭代的状态是每个迭代器实例。


旁注:请记住,通过保留只读集合,您只能防止对集合本身进行修改。每个集合元素仍然是可变的。

class Test {
    public Test(final int a, final int b) {
        this.a = a;
        this.b = b;
    }

    public int a;
    public int b;
}

public class Main {

    public static void main(String[] args) throws Exception {
        List<Test> values = new ArrayList<Test>(2);
        values.add(new Test(1, 2));
        values.add(new Test(3, 4));

        List<Test> readOnly = Collections.unmodifiableList(values);
        for (Test t : readOnly) {
            t.a = 5;
        }

        for (Test t : values) {
            System.out.println(t.a);
        }
    }

}

这输出:

5
5

@WMR 答案的重要考虑因素。

这取决于线程是否 阅读您的收藏已开始 在填充之前或之后。如果 他们在你填满之前就开始了, 你没有任何保证(没有 同步),这些线程 将永远看到更新的值。

造成这种情况的原因是Java内存 模型,如果你想了解更多,请阅读 此链接的“可见性”部分:http://gee.cs.oswego.edu/dl/cpj/jmm.html http://gee.cs.oswego.edu/dl/cpj/jmm.html

即使线程已启动 当你填满你的收藏后,你 可能必须同步,因为您的 收集实施可能会改变 即使在读取时其内部状态 操作(谢谢迈克尔 巴西奈 https://stackoverflow.com/questions/152342/in-java-do-i-need-to-declare-my-collection-synchronized-if-its-read-only#152425, 我不知道有这样的收藏 存在)。

另一个非常有趣的读物 并发主题涵盖 诸如对象发布之类的主题, 可见性等更详细 是布莱恩·戈茨的书爪哇 并发性 实践 http://www.briangoetz.com/pubs.html.

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

在 Java 中,如果我的集合是只读的,我是否需要将其声明为同步? 的相关文章

随机推荐

  • 获取整个语言文件数组

    我是新手拉拉维尔 4 0 如何从中获取整个数组lang en texts php 有没有Lang getAll method 我的目标是在我的基本控制器中生成关键字 描述 将它们填充到主刀片模板中 DO M 的元标记和其他位置 如果我的方法
  • Node.js WebRTC 客户端

    我正在寻找一个webrtc questions tagged webrtc实施node js questions tagged node js传输数据NodeJS 客户端到另一个 webRTC 对等点 所以就我而言 nodejs 应用程序是
  • 更新 Azure VM 规模集上的 VHD

    我已使用 Azure VM 的 vhd 在 Azure 上创建了 VMSS 如何将 VMSS 的源 vhd 更改为新的 vhd Get the following error 我们可以用Update AzureRmVmss and Upda
  • 使用openssl加密和解密小文件

    我想用 C C 编写一个小程序 它读取一个小文本文件 并使用 内部 密钥对其进行加密 然后我还想编写另一个小程序 它可以使用内部相同的密钥解密加密的文件 我查看了 openSSL 网站并用谷歌搜索 但发现不是简单的例子 有人尝试过做这件事吗
  • TypeError:stat:路径应该是字符串、字节、os.PathLike 或整数,而不是 _io.TextIOWrapper

    我在一个python教程网站上找到了以下代码 from nltk tag import StanfordNERTagger stanford classifier open english all 3class distsim crf se
  • Google Places API Android:自动完成关闭得太快

    我将 Place Autocompletion 添加到我的 Android 应用程序中 当我单击按钮时 chooseLocationButton 它会正确打开自动完成小部件 问题是当我想在搜索字段中写一个名字时 单击第一次击键后 自动完成小
  • 如何在 Asp.net 中使用 javascript 检测 IE 11

    您好 我想检测浏览器 IE 8 或更高版本适合我 为此 我使用了以下代码 但它对于 IE 11 失败 对于其他它的检测正确 function getInternetExplorerVersion var rv 1 Return value
  • MVVM 疯狂:命令

    我喜欢MVVM 我不喜欢它 但是喜欢它 大部分都是有道理的 但是 我一直在阅读鼓励您编写大量代码的文章 以便您可以编写 XAML 而不必在代码隐藏中编写任何代码 让我举一个例子 最近 我想将 ViewModel 中的命令连接到 ListVi
  • 在框架外使用 Laravel 4 的 Input 类

    我喜欢 Laravel 4 处理输入的方式 以及如何通过 Input get 获取值 无论它是通过 get post 还是其他方式发送 我正在开发一个不使用 Laravel 作为框架的项目 但如果我可以使用 Input 类 那就太好了 谁能
  • 在 Activity 之上创建一个透明对话框

    背景 我试图在当前活动之上放置一个层 该层将解释当前屏幕上发生的情况 类似于联系 应用程序 https play google com store apps details id com contapps android 我知道有一些解决方
  • 插入图像到Excel

    我正在使用 Visual Basic Express 我想将图像插入 Excel 应用程序 我已经成功了 这是代码 Dim oExcel As Object Dim oBook As Object Dim oSheet As Object
  • momentjs:如何获取特定时区的日期

    简而言之 我希望有时间尊重服务器的时区 我已将机器的时区设置为阿拉斯加 但我将布里斯班时区字符串传递给 moment 现在我需要moment toDate返回与我在 moment 构造函数中传递的时区相同的日期实例 例如 m moment
  • Matplotlib axvspan - 实心填充?

    我正在使用这行代码使用 matplotlib 创建跨图形的垂直跨度 matplotlib pyplot axvspan datetime datetime strptime 09 10 2015 d m Y datetime datetim
  • 如何检查网络路径是否存在?

    在linux中使用python了解网络路径 例如 192 168 1 1 test 是否存在的最佳方法是什么 如果 路径 指的是互联网 URL 则需要查看 urllib 模块 from urllib import urlopen try u
  • 将关系属性从 ER 图转换为 SQL

    目前我是第一次尝试掌握 SQL 所以我正在解决一些问题 这是一个示例数据库规范 学生 姓名 性别 课程 做项目 标题 每个项目都有 两名主管 姓名 性别 部门 所有学生都做一个项目 但并非所有项目都被接受 不止一名学生可以做同样的事情 项目
  • 如何编写迁移来重命名 Rails 中的 ActiveRecord 模型及其表?

    我不擅长命名 并意识到我的 Rails 应用程序中有一组更好的模型名称 有没有办法使用迁移来重命名模型及其对应的表 这是一个例子 class RenameOldTableToNewTable lt ActiveRecord Migratio
  • 如何不覆盖node.js中的文件

    我想让这段代码在文件存在时更改文件名而不是覆盖它 var fileName file fs writeFile fileName txt Random text function err if err throw err console l
  • Spring Boot 外部配置和 xml 上下文

    我想使用 Spring Boot 外部化我的配置 但我想继续部分使用我的 xml 上下文 我的主类 SpringServerApplication java Configuration PropertySources value Prope
  • 无法将类型“__NSArrayM”的值转换为“NSDictionary”

    我有一个 json 我正在尝试用该代码解析它 但它说 无法将类型 NSArrayM 的值转换为 NSDictionary do let dataDictionary NSDictionary try NSJSONSerialization
  • 在 Java 中,如果我的集合是只读的,我是否需要将其声明为同步?

    当我的 J2EE web 应用程序启动时 我会一次性填充一个集合 然后 多个线程可以同时访问它 但只能读取它 我知道使用同步集合对于并行写入是强制性的 但是我仍然需要它来进行并行读取吗 通常不会 因为在这种情况下您不会更改集合的内部状态 当