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多线程和安全发布[关闭] 的相关文章

  • APNS(Apple 推送通知服务器)的反馈服务

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

    Hej 我想使用 Validated group Foo class 在执行方法之前验证参数的注释 如下所示 public void doFoo Foo Validated groups Foo class foo 当我将此方法放入 Spr
  • 为什么我的 @OneToMany 属性出现主键违规?

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

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

    我想在图表的 X 轴上显示一些日期 并且here https stackoverflow com questions 5118684 jfreechart histogram with dates据说我必须使用 TimeSeriesColl
  • EJB 中 @Stateless 相对于 @Singleton 的真正用例是什么

    如果我正确理解EJB Singleton实际上与普通Java中的Singleton相同 也是spring中的单例 gt 一个实例 每个调用同时通过同一个实例 Stateless 声明一个 bean 它可以 但不得 具有多个实例 但限制是一个
  • 如何从 Trie 中检索给定长度的随机单词

    我有一个简单的 Trie 用来存储大约 80k 长度为 2 15 的单词 它非常适合检查字符串是否是单词 但是 现在我需要一种获取给定长度的随机单词的方法 换句话说 我需要 getRandomWord 5 来返回 5 个字母的单词 所有 5
  • Java 中通用方法参数的 getClass()

    以下 Java 方法无法编译
  • java中的第三个布尔状态是什么?

    虽然我知道根据定义 布尔值仅包含两种状态 真或假 我想知道布尔值在用这些状态之一初始化之前有什么值 它默认为 false http java sun com docs books tutorial java nutsandbolts dat
  • 在片段之间切换时底部导航栏会向下推

    在我的活动中 我有一个底部导航栏和框架布局来显示片段 一切正常 但问题是当我开始按顺序从 1 4 移动时 底部导航栏保持在其位置 但当我突然从 4 跳到2 然后底部导航栏就会超出屏幕 当再次单击同一项目时 它就会回到正常位置 该视频将清楚地
  • 如何在 Java 中创建一个带有连字符的值的静态枚举?

    如何创建如下所示的静态枚举 static enum Test employee id employeeCode 截至目前 我遇到了错误 这对于 Java 来说是不可能的 因为每个项目都必须是有效的标识符 并且有效的 Java 标识符可能不包
  • Java给定长度的随机数

    我需要在 Java 中生成一个恰好 6 位数字的随机数 我知道我可以在随机发生器上循环 6 次 但是在标准 Java SE 中还有其他方法可以做到这一点吗 要生成 6 位数字 Use Random http download oracle
  • 动态创建 JSON 对象

    我正在尝试使用以下格式创建 JSON 对象 tableID 1 price 53 payment cash quantity 3 products ID 1 quantity 1 ID 3 quantity 2 我知道如何使用 JSONOb
  • 测量 tomcat 的排队请求数

    因此 使用tomcat 您可以设置acceptCount值 默认为100 这意味着当所有工作线程都忙时 新连接被放置在队列中 直到队列满 之后它们被拒绝 我想要的是监视此队列中项目的大小 但无法确定是否有办法通过 JMX 获取此值 即不是队
  • 在java中创建一个XML树并将其转换为json对象

    我尝试创建也能够转换为 json 的树 但对于只有一个xpath 当我尝试实现多个 xpath 时 我无法获得所需的输出 这里我分享一下我的实现 private static Document addElemtbypath List
  • 乔达时间中两个日期之间的天数

    如何找到两次之间的天数差异乔达时间 http www joda org joda time DateTime http www joda org joda time apidocs org joda time DateTime html实例
  • 如何在apache POI中读取excel文件的准确单元格内容

    当我读取单元格的内容时 例如如果它是日期格式 它会转换为另一个值 例如 12 31 2099 gt 46052 和 50 00 gt 50 和 50 00 gt 0 5 但我想要的是获取每个单元格的确切字符串值 我的代码是这样的 cell
  • 接口中“不能降低继承方法的可见性”的含义

    我有两个文件 public interface PrintService void print PrintDetails details class PrintDetails private String printTemplate pub
  • 通过向上转换将 Java.sql.date 转换为 Java.util.date 安全吗?

    java sql date 扩展了 java util date 那么通过将 java sql date 转换为 java util date 是否可以在两者之间进行转换 或者有其他方法可以转换它们吗 您不一定需要强制转换 您可以将 SQL
  • Swing:创建可拖动组件...?

    我在网上搜索了可拖动 Swing 组件的示例 但我发现示例不完整或不起作用 我需要的是一个摇摆组件那可以是dragged通过鼠标 在另一个组件内 被拖拽的时候 应该已经 改变它的位置 而不仅仅是 跳 到目的地 我很欣赏无需非标准 API 即

随机推荐

  • 如何移动 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