在“实践中的Java并发”一书中,作者在谈到“锁定和可见性”时说:
现在,我们可以给出规则的另一个原因,即在访问共享可变变量时,所有线程都必须在同一个锁上同步--以确保一个线程编写的值对其他线程是可见的。否则,如果线程读取一个变量而不持有适当的锁,它可能会看到一个陈旧的值。
以下是数字:

我很好奇这里“可变”的意思。根据我在函数式编程方面的知识,“不变”的意思是不可变的和可变的对立面。图中的变量x是作者所称的共享可变变量。X(一个整数或其他类似的)是可变的吗?
发布于 2017-06-22 14:01:53
共享变量是共享内存中某个位置的占位符。由于可以有一个不可变的引用变量指向具有可变实例变量的对象,可能会出现一些混淆。
但是,您始终可以将所有对象图分解为一组简单变量。如果所有这些变量都是不可变的,那么整个对象图是不可变的。但是,如果其中一些变量是可变的,我们可能会讨论数据竞争的可能性,如果其中一个或多个变量在一个线程中被修改,然后被另一个线程读取。
对于这个讨论,它们在复杂对象图中的位置是无关的,这就是为什么讨论只使用两个可变变量,x和y,显然是int类型的。它们可能仍然是一个线程的成员,例如一个Point实例存储在一个HashMap中,但是唯一重要的是,这些x和y变量正在被修改,并且,正如在引用的书中所解释的那样,M的解锁将使这些修改对随后锁定M的任何线程都是可见的,因为这适用于所有变量,而不管它们在堆内存或对象图中的位置。
请注意,x和y的可变性质意味着它们在x=1重新部署之前可能存在较旧的值。y=1赋值,它可以在没有同步的情况下被读取时显示。这包括他们在第一次赋值之前的默认值(0)。
https://stackoverflow.com/questions/44693568
复制相似问题