是'可变变量'在java并发编程中与函数式编程的含义相同吗?

时间:2017-06-22 08:01:09

标签: java multithreading functional-programming locking mutable

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

  

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

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

我很好奇' mutable'这里。根据我在函数式编程方面的知识,' immutable'意味着不可改变的,可变的'相反。图中的变量x是作者所称的共享可变变量。 x(整数或其他类似的)是否可变?

1 个答案:

答案 0 :(得分:0)

共享变量是占位符,用于共享内存中的位置。可能存在一些混淆,因为您可以使用指向具有可变实例变量的对象的不可变引用变量。

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

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

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