以线程安全方式发布非线程安全对象字段

2024-02-23

我遇到了 Java 并发问题。是的,我查看了标题几乎完全相同的问题,但它们似乎都在问微妙不同的事情。是的,我读过Java 并发实践。是的,我明白为什么会这样defacto为主题提供参考。是的,我已经阅读了专门关于在线程安全类中发布字段的部分。是的,我仍然会问一个关于 Java 的并发问题,尽管我知道有人只会向我指出那本书。

但这让我感到困惑——我知道您可以通过确保具有波动性和/或同步访问的正确读/写顺序,以线程安全的方式轻松发布可变基元字段,并且 64 位基元需要具有原子访问由于其读/写操作缺乏原子性。我知道如何对需要在类字段的特定“快照”上执行的代码块使用锁。我完全了解原子包,其中包含 AtomicLong 等好东西。

但我仍然对将非线程安全对象发布为线程安全类中的字段感到困惑。

据我所知,一旦您在 getter 中返回对它的引用,您就为调用者提供了对对象内容的前所未有的访问权限,他们可以在任何时候使用它们。另外,如果您提供 setter,则允许他们将对象引用设置为他们可以在使用 setter 的对象之外控制的对象。

无论如何,我无法解决从非线程安全对象组成线程安全类而不将它们全部设为私有/受保护并在类中创建线程安全包装方法的问题all所有非线程安全对象都具有该类的用户可能想要使用的方法。这听起来就像是一场样板噩梦。

我的意思是,如果您将 AtomicReference 返回到 getter 中的对象,他们只需使用 .get() 即可再次获得对其的非同步访问。

我考虑的另一种方法是让所有 getter 基于旧对象返回非线程安全对象的新副本,这意味着修改是无关紧要的,这同样适用于 setter。但是 Java 有一个极其复杂的克隆对象系统(浅复制、深复制、特定复制等),这有点让我不敢这样做。而且,这效率很低,不会比使用以下语言更快:designed像 Clojure 一样具有不变性。事实上,考虑到此类语言允许多个不可变数据在幕后共享相同的数据,它可能会慢得多。

那么,如何以可行的方式组合已发布的非线程安全对象的线程安全类呢?

提前致谢。


如果对不安全对象的引用已逃逸到周围的线程 - 您无法采取任何措施来阻止其他线程改变状态,因此您应该保持引用的安全。如果您需要返回复杂的对象,请将数据设为私有,引入封装访问和修改的方法,并制作线程安全的副本(是的,克隆很麻烦)。

尝试看看http://en.wikipedia.org/wiki/Law_of_Demeter http://en.wikipedia.org/wiki/Law_of_Demeter设计原则。 quote:特别是,一个对象应该避免调用另一个方法返回的成员对象的方法。对于许多使用点作为字段标识符的现代面向对象语言,该法则可以简单地表述为“仅使用一个点”。也就是说,代码 a.b.Method() 违反了法律,而 a.Method() 则没有。举个简单的例子,当一个人想遛狗时,命令狗的腿直接走是愚蠢的;相反,人们命令狗并让它照顾自己的腿。

ps:恐怕这是一个开放式问题。

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

以线程安全方式发布非线程安全对象字段 的相关文章

  • 在 Eclipse 中隐藏重复的工具栏项

    我不知道如何 但我的 STS 有重复的工具栏项目 我不知道如何删除它们 这是我复制的工具栏的样子 我想摆脱这些 我试图隐藏工具栏 但这没有帮助 有人知道如何删除重复的吗 自从升级到 Oxygen 以来 我一直遇到同样的问题 我无法可靠地重现
  • ListView:防止视图回收

    我有一个使用回收视图的 ListView 我试图阻止视图被回收 所以我使用 setHasTransientState android support v4 view ViewCompatJB setHasTransientState Vie
  • 使用 Eclipse 将具有外部依赖项的 Java 项目导出到 jar

    有没有一种简单的方法可以将 Java 项目 包括其所有外部依赖项 导出到标准 jar 文件 我开发了一个使用多个 Apache 库的 SDK 我希望能够将该项目作为单个 jar 发布 到目前为止我找到的这个问题的答案要求将项目打包为 Run
  • APNS(Apple 推送通知服务器)的反馈服务

    我们正在使用Java作为推送通知提供商APNS I我能够将消息发送到APNS但我不知道如何获得该消息的反馈 请帮忙 反馈服务具有类似于用于发送推送通知的接口的二进制接口 您可以通过以下方式访问生产反馈服务feedback push appl
  • Java:无安全管理器:RMI 类加载器已禁用

    您好 我有 RMI 应用程序 现在我尝试从客户端调用服务器上的一些方法 我有以下代码 public static void main final String args try Setting the security manager Sy
  • 为什么这个动作不抽象? [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我很难理解为什么一个类中的一个操作是抽象的 而另一个类中的操作不是 源代码1 编译时出错 https gyazo com cd3c
  • Apache Commons VFS - 无法解析文件

    VFS 方法无法处理此 URI jboss server temp dir local outgoing配置在jboss beans xml这是决心 C Download jboss eap 5 1 1 server default tmp
  • 为什么我的 @OneToMany 属性出现主键违规?

    我有一个实体 Entity public class Student GeneratedValue strategy GenerationType AUTO Id private long id OneToMany private Set
  • Java - toString 到 Color

    我一整天都在努力解决这个问题 基本上我做了一个 for 循环 将条目添加到数组列表中 其中一项是 颜色 变量 我已经用过random nextInt为颜色构造函数的红色 绿色和蓝色部分创建新值 我还设置了一个toString方法 这样我就可
  • 如何在 Python 中加密并在 Java 中解密?

    我正在尝试在 Python 程序中加密一些数据并将其保存 然后在 Java 程序中解密该数据 在Python中 我像这样加密它 from Crypto Cipher import AES KEY 1234567890123456789012
  • 在 Java 中的 JFrame/JPanel/JComponent 中添加 Web 浏览器

    我正在开发一个 Java 应用程序 需要在应用程序中使用 Web 浏览器 我见过一些应用程序这样做 例如在同一应用程序中单击左侧面板中的提要并打开右侧面板中的链接时的 RSS 阅读器 我想实现类似的功能 在java中可以做到这一点吗 Jav
  • 如何将测试类打包到jar中而不运行它们?

    我正在努力将我的测试类包含到 jar 包中 但不运行它们 经过一番谷歌搜索后 我尝试过mvn package DskipTests 但我的测试类根本没有添加到 jar 中 有任何想法吗 如果您遵循 Maven 约定 那么您的测试类位于src
  • 单元测试、集成测试还是设计中的问题?

    我编写了我的第一个单元测试 我认为它过于依赖其他模块 我不确定是否是因为 这是一个复杂的测试 我实际上已经编写了集成测试或 我的设计有问题 我首先要说的是 虽然我有大约 4 年的开发经验 但我从未学过 也没有人教过自动化测试 我刚刚使用 H
  • 用于安装 R 软件包的备用编译器:clang:错误:不支持的选项“-fopenmp”

    我正在尝试在 OS X 10 11 6 上使用 R 版本 3 4 0 安装 rJava 包 install packages rJava type source 我收到以下错误 clang o libjri jnilib Rengine o
  • 线程上下文类加载器和普通类加载器的区别

    线程的上下文类加载器和普通类加载器有什么区别 也就是说 如果Thread currentThread getContextClassLoader and getClass getClassLoader 返回不同的类加载器对象 将使用哪一个
  • 动态创建 JSON 对象

    我正在尝试使用以下格式创建 JSON 对象 tableID 1 price 53 payment cash quantity 3 products ID 1 quantity 1 ID 3 quantity 2 我知道如何使用 JSONOb
  • 内部类的访问修饰符[重复]

    这个问题在这里已经有答案了 可能的重复 受保护 公共内部类 https stackoverflow com questions 595179 protected public inner classes 我确信这个问题已经被问过 但我找不到
  • 使用 Commons 或 Guava 将文本文件转换为 Java Set

    我想将文件中的每一行加载到 HashSet 集合中 有没有一种简单的方法可以做到这一点 怎么样 Sets newHashSet Files readLines file charSet 使用番石榴 参考 文件 readLines http
  • 检查 Java 字符串实例是否可能包含垃圾邮件数据的最简单方法

    我有一个迭代 String 实例的过程 每次迭代对 String 实例执行很少的操作 最后 String 实例被持久化 现在 我想为每次迭代添加一个检查 String 实例是否可能是垃圾邮件的检查 我只需验证 String 实例不是 成人材
  • 在 for 循环比较中使用集合大小

    Java 中 Collections 的 size 方法是否有编译器优化 考虑以下代码 for int i 0 i

随机推荐

  • Java实例变量可访问性[重复]

    这个问题在这里已经有答案了 Java中以下变量的可访问性有什么区别 public class Joe public int a protected int b private int b int c 我最感兴趣的是最后一个在做什么 publ
  • 属性的 CNContact 编码

    我有一个包含名字的 v 卡字符串Andr 我初始化一个CNContact与 v 卡 BEGIN VCARD VERSION 2 1 N Foo Andr FN Andr Foo TEL CELL 00023 4474848 END VCAR
  • 尝试通过 AWS Lambda 连接到 Redshift

    我正在使用节点 postgres https github com brianc node postgres我的 AWS Redshift 数据库的客户端 在本地 我可以运行以下代码node 获取 gt gt 已连接 和 gt gt gt
  • PostgreSQL 字符串字符替换

    我正在尝试编写一个词汇数据库来存储由词根和模式组成的单词 我想知道如何创建一个为我组合词根和模式的列 同时忽略不具有两个列的行SELECT查询已填充 基本上 我有来自 PostgreSQL 数据库的输出 SELECT root root i
  • PHP 函数的 Big-O 列表

    使用 PHP 一段时间后 我注意到并非所有内置 PHP 函数都像预期的那么快 考虑一个函数的这两种可能的实现 该函数使用缓存的素数数组来查找一个数字是否是素数 very slow for large prime array prime ar
  • 在文本中查找大量字符串 - Python

    我正在寻找解决这个问题的最佳算法 有一个小句子列表 或一个字典 一组 在更大的文本中找到该句子的所有出现 列表 或字典或集合 中的句子约为 600k 但平均由 3 个单词组成 文本平均长度为 25 个字 我刚刚格式化了文本 删除标点符号 全
  • RAC 环境的 Oracle 连接字符串?

    我已经获得了 ORACLE RAC 环境访问权限 详细信息是 数据库名称 orcl 服务名称 orcl IP地址 192 168 1 1和192 168 1 2 SQL gt host srvctl status database d or
  • C 中的复合类型是什么?

    From 6 2 7 5 http www open std org jtc1 sc22 wg14 www docs n1570 pdf 第 66 页 示例 给定以下两个文件范围声明 int f int double 3 int f int
  • Scrapy 返回多个项目

    我是 Scrapy 的新手 我真的不知道如何在一个块中返回多个项目 基本上 我得到一个 HTML 标签 其中有一个引用 其中包含文本 作者姓名的嵌套标签以及有关该引用的一些标签 这里的代码只返回一个引号 仅此而已 它不使用循环来返回其余部分
  • EPPlus 绑定后不计算公式输出

    我正在使用 EPPlus 我被单元格公式困住了 我的代码如下 ExcelPackage pck new ExcelPackage D MYSheets EmptyFile xlsx var ws pck Workbook Worksheet
  • 让背景或相机根据角色位置“滚动”

    我正在开发一款具有自上而下视图的角色扮演游戏 我想将一张图片加载到角色正在行走的背景中 但到目前为止我还没有弄清楚如何正确地重绘背景以使其 滚动 我发现的大多数示例都是自动滚动的 我希望相机保持在角色中心 直到背景图像到达其边界 然后角色将
  • 三元?运算符与 C# 中传统的 If-else 运算符的比较 [重复]

    这个问题在这里已经有答案了 可能的重复 条件运算符慢吗 https stackoverflow com questions 2259741 is the conditional operator slow 我是该产品的大量用户 C 中的运算
  • 在 C++ 中,全局范围内只允许使用“表达式”来初始化全局对象。我在标准中哪里可以找到这个内容?

    被注释掉的表达下面的代码无法编译 因为它在全局范围内 但是我在 C 标准中哪里可以找到与此限制相关的内容呢 据我回忆 表达式只允许在全局范围内初始化全局对象 我已经调查过第 5 章 表达式 无济于事 include
  • Openlayers:具有不同层的集群

    我有多个层 WFS 可以从菜单中选择 我使用 Openlayers 每层都有不同的标记 如下图所示 但是 我想对点进行分组 即使用聚类技术 我看到了这个例子http viglino github io ol ext examples ani
  • TypeError:无法读取未定义的属性“数据” - 无法访问Reactjs中超出特定级别的对象“道具”

    我正在 via 中进行 API 调用axios in React with a UseEffect 我们将响应设置为一个名为的变量data using useState const data setData useState setData
  • 如何向位图添加外发光?

    我正在寻找创建这样的东西 http imm io Bcco http imm io Bcco 外部发光 图像周围的空白 我已经看过了如何在位图周围制作发光效果 https stackoverflow com questions 433434
  • R Shiny:不确定为什么 ggplot 失败

    这里是闪亮的新手 我正在尝试编写一个 R 闪亮脚本 我想做的一件事是生成给定日期和不同区域的给定广告商的广告浏览量的直方图 我的表有以下列 带有示例数据 Date Impressions Advertiser Factor 1 DMA 2
  • PHP - 静态类和缓存类

    下面的代码是我用来缓存对象的方法Java class Account private static ArrayList
  • Google Feeds API 无法正常工作 - 是否已关闭?

    我今天早上刚刚打开我正在开发的新闻网站 没有显示任何 RSS 新闻提要 我进入 Google 提要论坛查看是否有任何关于它的帖子 我发现的唯一内容是这 https developers google com feed forum place
  • 以线程安全方式发布非线程安全对象字段

    我遇到了 Java 并发问题 是的 我查看了标题几乎完全相同的问题 但它们似乎都在问微妙不同的事情 是的 我读过Java 并发实践 是的 我明白为什么会这样defacto为主题提供参考 是的 我已经阅读了专门关于在线程安全类中发布字段的部分