java - 多个线程在java中使用同一个对象是否复制它?

标签 java multithreading thread-safety thread-synchronization java-threads

Java 中的多个线程 如何处理传递给它们的单个对象引用

他们是复制一个对象然后使用它,还是使用同一个对象?

欢迎任何技术解释。

在上下文中我无法理解这一点,如果线程将一些数据传递给对象并进入休眠状态,而一个线程正在 sleep ,另一个线程使用相同的对象将数据传递给它并进入休眠状态。

最后一个数据会覆盖对象中的前一个数据吗?

最佳答案

你可以看看java内存模型。您会看到所有对象都存储在堆内存中,该内存在整个应用程序中共享。每个线程共享相同的堆空间,但它们也有自己的堆栈内存,用于存储对对象的引用。所以如果一个线程在对象上工作,它有自己对该对象的引用,但这个引用指向堆空间中的对象,每个线程都会看到。因此,要回答您的问题,如果第二个线程将对该对象执行某些操作,然后进入 hibernate 状态甚至死亡,则前一个线程在唤醒时将看到这些更改,因为它的引用指向同一个对象。

我找到了可以帮助您理解的有趣图像:

http://tutorials.jenkov.com/java-concurrency/java-memory-model.html

图片来自:http://tutorials.jenkov.com/java-concurrency/java-memory-model.html

关于java - 多个线程在java中使用同一个对象是否复制它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41956753/

相关文章:

java - 无法使用 FXMLLoader#setRoot

java - Ebean ManyToOne 可为空联接

Java 阶乘输出

java - 基于另一个线程结果的数据库回滚

c# - 强制应用程序仅运行单核?

c++ - shared_ptr 和 const 方法线程安全

java - Kotlin 对由注释设置值的变量返回 null

c# - c#中的互斥量和信号量是什么?我们需要在哪里实现?

javascript - 访问异步函数之外的变量时的JS安全性

java - BigDecimal compareTo() 线程安全