Java多线程和安全发布[关闭]

2024-05-01

看完之后 ”Java并发实践 http://jcip.net/" and "OSGI 实践 http://neilbartlett.name/blog/osgibook/“ 我发现一个非常有趣的特定主题:安全出版。以下内容来自 JCIP:

为了安全地发布对象,对象的引用和对象的状态必须同时对其他线程可见。正确构造的对象可以通过以下方式安全地发布:

  • 从 a 初始化对象引用static初始化程序。
  • 将对它的引用存储到volatile field.
  • 将对它的引用存储到final field.
  • 将对它的引用存储到由 ( 适当保护的字段中同步的) lock.

我的第一个问题:有多少 Java 开发人员意识到这个(问题)? 有多少现实世界的 Java 应用程序真正遵循这一点,这真的是一个真正的问题吗?我有一种感觉,99% 的已实现 JVM 并没有那么“邪恶”,即线程不能保证(事实上,它实际上(几乎)“不可能”)看到过时的数据,只是因为引用没有遵循上面的“安全发布习惯用法”。


按比例来说,可以公平地说,很少有程序员充分理解同步和并发。谁知道现在有多少服务器应用程序管理金融交易、医疗记录、警察记录、电话等,这些应用程序充满了同步错误,并且基本上是偶然工作的,或者非常偶然地失败(从来没有听说过有人得到幻像)电话费已添加到他们的电话账单中?),其原因从未真正调查或深究过。

对象发布是一个特殊的问题,因为它经常被忽视,并且编译器在这个地方进行优化是非常合理的,如果您不知道的话,可能会导致意外的行为:在 JIT 编译的代码中,存储一个指针,然后增加它并存储数据是一件非常合理的事情。您可能认为它是“邪恶的”,但从低层次来看,这确实是您所期望的 JVM 规范。 (顺便说一句,我听说在 JRockit 中运行的现实程序遇到了这个问题——这不仅仅是理论上的。)

如果您知道您的应用程序存在同步错误,但在当前硬件上的当前 JVM 中没有出现异常行为,那么 (a) 恭喜; (b),现在是时候开始“平静地走向消防出口”,在需要升级太多组件之前修复代码并教育程序员。

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

Java多线程和安全发布[关闭] 的相关文章

随机推荐

  • 如何移动 UITextField 中的清除按钮?

    由于某种原因 当我添加 UITextfield 作为表格单元格内容视图的子视图时 清除按钮与字段中键入的文本不对齐 并且出现在其下方 有什么方法可以移动清除按钮的文本来阻止这种情况发生吗 谢谢你的帮助 正如 Luda 所说 正确的方法是子类
  • 找不到满足 pkg-resources==0.0.0 要求的版本

    我的应用程序部署在heroku 当我通过推送我的代码时git push heroku master 它给了我这个错误 Collecting pkg resources 0 0 0 from r requirements txt line 1
  • 如何从 InputStream 读取一行而不缓冲输入? [复制]

    这个问题在这里已经有答案了 我有一个输入流 其中包含一行字符串 然后是二进制数据 如果我使用读取该行new BufferedReader new InputStreamReader inputStream 二进制数据也正在被读取并且不能被重
  • 如何将 Ctrl+,(control 加逗号)指定为 WPF 菜单项的键盘快捷键?

    Question I would like to assign the keyboard shortcut Ctrl control plus comma to the Preferences menu item How do I do t
  • 证明:为什么 java.lang.String.hashCode() 的实现与其文档相符?

    JDK 文档为java lang String hashCode http java sun com javase 6 docs api java lang String html hashCode famously https stack
  • OSGI Felix 容器正在初始化模拟私有字段

    我试图模拟我的类中的一个私有字段 该字段由运行我的应用程序的 OSGI 容器初始化 我放了一个示例代码供参考 请提供任何线索 import org apache felix scr annotations Component name My
  • 重新渲染模板时的 Meteor 回调

    我目前有一个模板 其中包含 each 在其中循环 我正在尝试找到一种方法来触发特定功能 each 循环已完成 Template rendered仅在第一次渲染模板时运行 因此不幸的是 这不起作用 有什么可以做到这一点吗 我就是这样做的 Te
  • 不符合 BindableObject 协议 - Xcode 11 Beta 4

    尝试一下那里的例子 找到一个项目 其中有一个类bindableobject并且它没有给出任何错误 现在 Xcode 11 beta 4 已经发布 我收到错误 类型 UserSettings 不符合协议 BindableObject 它有一个
  • 按位置获取元素?

    我正在研究 SVG 脚本 有 getElementById 或 getElementsByTagName 但我找不到任何方法来按位置获取元素 比如获取位置为x 10 y 10的元素 有什么办法可以实现这个目标吗 var yourElemen
  • Bootstrap 100% 宽度/全宽度

    我想用 Bootstrap 创建一个新网站 我需要它的宽度为 100 但我不希望它是流畅的 至少现在不是 我遇到的问题是 使用 bootstrap 标准将您限制为 960px 并且使用流体布局它是全宽的 但其行为就像流体布局应该通过在窗口尺
  • 如何在Nightwatch中测试伪元素的css属性

    我想使用 Nightwatch 测试我的网站上的背景图像是否正确 但它设置为 before 伪元素的背景 这是 CSS icon circle delete before content background url images svg
  • 错误:专用 IP 需要 invalid_request device_id 和 device_name

    我正在使用 localhost 8080 使用 Google Drive API 进行开发 突然我想在我的本地部署沙箱中测试它 它的IP地址为 192 168 1 1 8080 据此 我更改了开发人员控制台客户端回调 URL 中的凭据 我正
  • .NET 参考源代码中的四个破折号组是什么?

    我正在浏览源码PluralizationService http referencesource microsoft com System Data Entity Design System Data Entity Design Plura
  • 在 g++ 中链接文件

    最近我尝试用g 在Ubuntu上 编译一个程序 通常我使用 Dev C 在 Windows 上 只要我创建一个项目并将所有必要的文件放入其中 它就可以正常工作 编译程序时出现的错误是 filename cpp undefined refer
  • 如何在ModelAdmin中使用InlinePanel?

    我正在设置一个需要使用多个子模型实例创建的模型 我希望能够在管理界面中编辑和创建此模型 因此我使用以下命令添加它ModelAdmin http docs wagtail io en v1 9 reference contrib modela
  • PHP 5.5中的password_hash函数

    我有以下函数 可以对密码进行哈希处理并将其存储在数据库中 我正在尝试使用 php 5 5 中的password hash 函数 但它给了我奇怪的结果 function hashpass password include includes c
  • 在 SugarCRM 中,将帐户所有权转让给其他用户不会更新联系人所有权

    我正在使用 SugarCRM v6 x 并发现当将帐户所有权转移给新的销售代表 分配的用户 ID 字段 时 联系人和其他相关子记录也不会转移 这是 SugarCRM 作者的实际设计选择吗 如果是 其背后的原因是什么 是否有推荐的帐户转移方法
  • Android 数字格式不知为何是错误的,我得到的不是 3.5,而是 3.499999999,为什么?

    我将一些数据存储在数据库中 然后使用游标读取这些数据 所有数据均为 56 45 3 04 0 03 类型 即小数点后两位 现在我想对它们求和 但这似乎并不容易 我得到这些数字c getDouble 3 然后我将它添加到 sum 变量中 如下
  • iOS 信号处理程序可以轻松收集哪些原因信息?

    我正在尝试向应用程序添加一些崩溃日志记录 并且我有一个signal设置处理程序以捕获标准 致命 信号 我可以在信号处理程序中实际 简单地收集哪些 原因 信息 如果有 以进行记录 我花了大约 2 小时谷歌搜索内容 但我找到的大部分内容都是针对
  • Java多线程和安全发布[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 看完之后 Java并发实践 http jcip net and OSGI 实践 http neilbartlett name blog osgi