当前位置: 首页 > 知识库问答 >
问题:

Java多线程读取信息

郎鸿
2023-03-14

有一天我在想线程,我开始怀疑如果多个线程根本不修改它,它们是否可以访问相同的信息(不使用同步(锁))。

一个例子是10个线程读取1个类,由于我们称之为M的线程,这些线程调用访问器从这个类中获取信息,但不以任何方式修改信息。
同时,线程M偶尔会修改这个类中的数据(这将改变10个线程在“重启”后正在进行的计算结果)

会有问题吗?问题是其中一个线程将线程M修改过的信息“放回”。最重要的是,是否有一天访问一条信息仍然会导致Java将信息放回内存,即使它从未被修改过?

谢谢

编辑:调用前面有最终值的访问器是否安全?比如...最终对象t=某些访问器();

共有1个答案

强保臣
2023-03-14

不,线程读取单个值不会有问题,但如果写入操作不是原子操作,则读取数据会出现一致性问题,尤其是在读取多个值时。

想象一下,就像一个线程正在读取两个数据点(比如一个x和一个y)一样,主线程正在更新这些x和y的值。我们可以说,x从1变为10,y从2变为20。

可能发生以下情况:

  1. 主线程将X更新为10

现在,工作线程正在处理不一致的数据。如果这是对机器人手臂的控制,而不是(1,2)和(10,20)的两个漂亮点,则手臂会猛拉到(10,2)并造成损坏。如果这是一个图,可能会出现随机无关点。

尽管有(volatile关键字)的影响(在某些JVM上可能会加剧),但这种情况还是会发生。

对于任何给定的读取或写入都不太可能发生(除非在两个线程中出现紧密循环的情况下),但单个不一致的读取甚至会导致不良输出、程序崩溃甚至严重的硬件损坏。

您可以将坐标封装在一个简单的POJO中(包含字段、构造函数、getter和setter的类),并使用原子引用(AtomicReference)以原子方式交换坐标。

 类似资料:
  • 在我们的Java应用程序中,我需要从oracle数据库中读取8000万记录。我试图为此重新设计多线程程序。目前,我们使用Java5个线程池,10个线程基于主键模式并行读取数据库。每个线程将读取不同的模式,如001*和002*。 如何提高该计划的性能?我正在考虑设计模式,让引导线程读取数据库并将处理委托给子线程。在我们现有的设计中,不同的线程通过10个jdbc连接访问表。使用新方法,我将只有一个线程

  • 主要内容:1 什么是Java currentThread()方法,2 Java currentThread()方法的语法,3 Java currentThread()方法的例子1 什么是Java currentThread()方法 Java currentThread() 方法返回当前正在执行的线程的引用。 2 Java currentThread()方法的语法 3 Java currentThread()方法的例子 输出结果为:  

  • 问题内容: 我仍在全神贯注地了解Java中并发的工作方式。我知道(如果您订购的是OO Java 5并发模型)则分别实现a 或with 或or 方法,并且它应该使您尽可能多地并行实现该方法。 但是我仍然不了解Java并发编程的内在知识: 一个是怎样的方法分配给执行工作的同时适量的? 作为一个具体的例子,如果我有一个I / O绑定的方法,该方法将从本地系统上的文件中读取Herman Melville的

  • 我正在开发一个应用程序(控制台),其中包含一个while循环,我希望允许用户暂停和恢复。经过一些研究,似乎一个额外的线程负责等待用户输入是正确的解决方案。 我已经能够实现持续等待输入的额外线程,并且还有一个kill方法,它设置flag变量来停止线程while()循环。不幸的是,除非有输入,否则while循环不会结束,只有在输入线程的while环至少完成一次后,这个kill标志才会生效。由于主线程也

  • 本文向大家介绍java 多线程-线程通信实例讲解,包括了java 多线程-线程通信实例讲解的使用技巧和注意事项,需要的朋友参考一下 线程通信的目标是使线程间能够互相发送信号。另一方面,线程通信使线程能够等待其他线程的信号。 通过共享对象通信 忙等待 wait(),notify()和 notifyAll() 丢失的信号 假唤醒 多线程等待相同信号 不要对常量字符串或全局对象调用 wait() 通过共

  • 本文向大家介绍python多线程分块读取文件,包括了python多线程分块读取文件的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了python多线程分块读取文件的具体代码,供大家参考,具体内容如下 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。