java并发编程中的“可变变量”一词与函数式编程中的含义相同吗?

Posted

技术标签:

【中文标题】java并发编程中的“可变变量”一词与函数式编程中的含义相同吗?【英文标题】:Is the word 'mutable variable' in java concurrency programming same as the meaning in functional programming? 【发布时间】:2017-11-25 09:20:05 【问题描述】:

在《Java Concurrency in Practice》一书中,在谈到“锁定和可见性”时,作者说:

我们现在可以给出规则要求所有线程在访问共享可变变量时在同一个锁上同步的另一个原因——以保证一个线程写入的值对其他线程可见。否则,如果一个线程在没有持有适当锁的情况下读取一个变量,它可能会看到一个陈旧的值。

下图:

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

【问题讨论】:

您必须区分变量。一个变量可以是可变的(因为你可以设置它的值,你可以为任何非final 变量设置它),但是值是不可变的(例如Integer 是不可变的,List 是(可能)可变的)。但是具有可变值的final 变量仍然被认为是可变的。 不可变意味着如果您更改对象的值,您实际上是在创建一个新对象。 @Nathan 不,不变性意味着您无法更改值(即“如果更改值”永远不会发生)。您可以创建一个新对象,但这不会影响第一个对象的值。 @AndyTurner 这就是我想表达的,但我应该说“如果你改变你的变量的值”,对吧? @Nathan 但它是一个可变变量。 【参考方案1】:

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

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

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

请注意,xy 的可变性质意味着它们在 x=1 之前可能存在较旧的值。 y=1 assignments,不同步读取时会出现。这包括他们在第一次分配之前的默认值 (0)。

【讨论】:

以上是关于java并发编程中的“可变变量”一词与函数式编程中的含义相同吗?的主要内容,如果未能解决你的问题,请参考以下文章

Swift函数式编程六(不可变性的价值)

致开发人员:沉迷面向对象编程不可自拔?函数式编程了解一下

函数式编程Java函数式编程学习

函数式编程Java函数式编程学习

函数式编程Java函数式编程学习

为什么开发人员喜欢函数式编程?