gpt4 book ai didi

java - 不可变对象(immutable对象)是线程安全的,但为什么呢?

转载 作者:IT老高 更新时间:2023-10-28 20:46:09 25 4
gpt4 key购买 nike

例如,一个线程通过创建它的对象来创建和填充不可变类的引用变量,另一个线程在第一个线程完成之前启动并创建不可变类的另一个对象,不可变类不会使用是线程不安全的吗?

创建不可变对象(immutable对象)也意味着所有字段都必须标记为 final。

it may be necessary to ensure correct behavior if a reference toa newly created instance is passed from one thread to another withoutsynchronization

他们是否想说其他线程可能会将引用变量重新指向不可变类的其他对象,这样线程将指向不同的对象而导致状态不一致?

最佳答案

实际上不可变对象(immutable对象)总是线程安全的,但它的引用可能不是。

困惑??你不应该:-

回归基本:线程安全仅仅意味着两个或多个线程必须在共享资源或对象上协同工作。它们不应覆盖任何其他线程所做的更改。

现在 String 是一个不可变的类,每当一个线程试图改变它时,它最终只会创建一个新对象。因此,即使是同一个线程也不能对原始对象进行任何更改,谈论另一个线程就像去 Sun 一样,但这里的问题是,通常我们使用相同的旧引用来指向新创建的对象。

当我们编写代码时,我们只使用引用来评估对象的任何变化。

声明 1:字符串 str = "123";//最初字符串共享给两个线程

声明 2:str = str+“第一线程”;//由线程一执行

声明 3:str=str+"第二线程";//由线程二执行

现在由于没有 synchronize、volatile 或 final 关键字告诉编译器跳过使用其智能进行优化(任何重新排序或缓存的东西),这段代码可以按以下方式运行。

  1. 加载 Statement2,所以 str = "123"+"FirstThread"
  2. 加载 Statement3,所以 str = "123"+"SecondThread"
  3. Store Statement3,所以 str = "123SecondThread"
  4. 存储 Statement2,所以 str = "123FirstThread"

最后是引用 str="123FirstThread"中的值,如果我们假设幸运的是我们的 GC 线程正在 hibernate ,那么我们的不可变对象(immutable对象)仍然存在于我们的字符串池中,并且未被触及。

因此,不可变对象(immutable对象)始终是线程安全的,但它们的引用可能不是。为了使它们的引用线程安全,我们可能需要从同步的 block /方法中访问它们。

关于java - 不可变对象(immutable对象)是线程安全的,但为什么呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9303532/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com