在阅读了“ 实践中的Java并发 ”和“ 实践OSGI ”之后,我发现了一个非常有趣的特定主题。安全发布。以下是来自JCIP的内容:
为了安全地发布对象,必须同时使对该对象的引用和该对象的状态对其他线程可见。可以通过以下方式安全地发布正确构造的对象:
我的第一个问题:有多少个Java开发人员知道此问题?实际有多少个实际的Java应用程序在关注这个,这真的是一个真正的问题吗?我有一种感觉,就是99%的已实现JVM都不存在“邪恶”的现象,即不能保证线程(实际上,它的实际(几乎)是“不可能的”)看到陈旧的数据只是因为引用未遵循上面的“安全出版物成语”。
从比例上讲,可以说几乎没有程序员充分了解同步和并发性。谁知道现在有多少服务器应用程序在管理财务交易,医疗记录,警察记录,电话等,这些同步器中充满了同步错误,本质上是偶然发生的,或者偶而会失败(从来没有听说过有人幻像)电话费已添加到他们的电话帐单中?)的原因从来没有真正被调查过或深入了解过。
对象发布是一个特别的问题,因为它经常被忽略,在这里,编译器进行优化是很合理的,如果您不了解它,可能会导致意外行为:在JIT编译的代码中,存储指针,然后增加它并存储数据是一件非常合理的事情。您可能会认为这是“邪恶的”,但是从低层次看,这确实是您期望JVM规范的方式。(顺便说一句,我听说过在JRockit中运行的现实程序会遇到此问题-这不完全是理论上的。)
如果您知道您的应用程序存在同步错误,但是在当前硬件上的当前JVM中没有出现异常,那么(a)表示祝贺;(b),现在是时候开始“从容地走向火出口”,修复代码并在需要升级太多组件之前对程序员进行教育。
我找到了关于线程安全的代码,但它没有来自给出示例的人的任何解释。我想知道为什么如果我不在“count”之前设置“synchronized”变量,那么count值将是非原子的(总是=200是期望的结果)。谢谢
如果有多个Java线程同时写入同一个套接字实例,这会影响从同一个套接字读取的对象的完整性吗?例如,对象的内容是否会被弄乱等。对象的顺序可以是随机的。
问题内容: 我从一个非常简单的多线程示例开始。我试图做一个线程安全的计数器。我想创建两个线程,使计数器间歇地增加到1000。以下代码: 据我所知,while循环现在意味着只有第一个线程才能访问计数器,直到达到1000。输出: 我该如何解决?如何获得共享计数器的线程? 问题答案: 两个线程都可以访问您的变量。 您看到的现象称为线程饥饿。输入代码的受保护部分后(很抱歉,我之前错过了它),其他线程将需要
我有一个从Rabbit接收消息的应用程序。当收到一条消息时,它会对它进行处理,然后在完成时执行ACK。应用程序可以在一个固定的线程池中同时处理2个项目,有2个线程。Rabbit的QOS预取设置为2,因为我不想在一个时间框架内给应用提供超过它所能处理的内容。 现在,我的消费者的handleDelivery执行以下操作: 此时,您已经发现TestWrapperThread将调用作为最后一个操作。 根据
问题内容: 鉴于以下多态: 我们如何在没有昂贵的getInstance()方法同步和双重检查锁定争议的情况下使它保持线程安全和懒惰?这里提到了单例的有效方法,但似乎并没有扩展到多例。 问题答案: 使用Java 8,它甚至可以更简单:
我有一个应用程序,它有一个ConcurrentHashMap本地存储一个存储在外部服务器上的数据副本。地图每隔几秒钟就会更新一次数据的新副本。 我有一个循环,每隔几秒钟运行一次,它可以访问HashMap并按照值的顺序将元素添加到数组中(实际上它做的事情还多一些,但这并不相关)。我的问题是,如果数据在创建数组的过程中发生了变化,您可能会在不同的地方有重复的键,或者完全省略一些键。 示例: 如您所见,