gpt4 book ai didi

java - java并发编程中的 'mutable variable'这个词和函数式编程中的含义一样吗?

转载 作者:太空宇宙 更新时间:2023-11-04 11:23:05 26 4
gpt4 key购买 nike

在《Java并发实践》一书中,在谈到“锁定和可见性”时,作者说道:

We can now give the other reason for the rule requiring all threads to synchronize on the same lock when accessing a shared mutable variable—to guarantee that values written by one thread are made visible to other threads. Otherwise, if a thread reads a variable without holding the appropriate lock, it might see a stale value.

这是图: Figure 3.1. Visibility guarantees for synchronization.

我很好奇这里“可变”的含义。根据我对函数式编程的了解,“不可变”意味着不可更改,而“可变”则相反。图中的变量x就是作者所说的共享可变变量。 x(整数或其他类似的整数)是可变的吗?

最佳答案

共享变量是共享内存中某个位置的占位符。由于您可以有一个不可变的引用变量指向具有可变实例变量的对象,因此可能会出现一些困惑。

但是您始终可以将所有对象图分解为一组简单变量。如果所有这些变量都是不可变的,那么整个对象图也是不可变的。但如果其中一些变量是可变的,那么如果其中一个或多个变量在一个线程中修改并由另一个线程读取,我们可能会进入关于数据争用可能性的讨论。

对于本次讨论,它们在复杂对象图中的位置是无关紧要的,这就是为什么讨论仅使用两个可变变量,xy(显然是 int 类型)的原因。他们仍然可能是 a 的成员,例如存储在 HashMap 中的 Point 实例,但唯一重要的是这些 xy 变量正在被修改,并且如引用书中所述,解锁 M 将使这些修改对随后锁定 M 的任何线程可见,因为这适用于所有变量,无论它们在堆内存或对象图中的位置如何。

请注意,xy 的可变性质意味着它们在 x=1 之前可能有较旧的值。 y=1 赋值,在不同步的情况下读取时会显示。这包括第一次赋值之前的默认值 (0)。

关于java - java并发编程中的 'mutable variable'这个词和函数式编程中的含义一样吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44693568/

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