在“实践中的Java并发”一书中,当谈到“锁定和可见性”时,作者说:
我们现在可以给出规则的另一个原因,即在访问共享的可变变量时要求所有线程在同一个锁上同步 - 以保证一个线程写入的值对其他线程可见。否则,如果线程在没有保持适当锁的情况下读取变量,则可能会看到过时的值。
这是图:
我很好奇' mutable'这里。根据我在函数式编程方面的知识,' immutable'意味着不可改变的,可变的'相反。图中的变量x是作者所称的共享可变变量。 x(整数或其他类似的)是否可变?
答案 0 :(得分:0)
共享变量是占位符,用于共享内存中的位置。可能存在一些混淆,因为您可以使用指向具有可变实例变量的对象的不可变引用变量。
但是你总是可以将所有对象图分解为一组简单变量。如果所有这些变量都是不可变的,那么整个对象图是不可变的。但是,如果其中一些变量是可变的,如果在一个线程中修改了一个或多个这些变量并由另一个线程读取,我们可以进入关于数据争用可能性的讨论。
对于这个讨论,它们在复杂对象图中的位置是无关紧要的,这就是为什么讨论只使用两个可变变量x
和y
,显然属于int
类型的原因。它们仍然可以是例如a的成员。 Point
实例存储在HashMap
中,但唯一重要的是这些x
和y
变量正在被修改,并且如引用的书中所述,解锁M
将使这些修改对随后锁定M
的任何线程可见,因为这适用于所有变量,无论它们在堆内存或对象图中的位置如何。
请注意x
和y
的可变性质意味着在x=1
resp之前可能存在较旧的值。 y=1
分配,在没有同步的情况下读取时会显示。这包括他们在第一次分配之前的默认值(0
)。