首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java并发编程中的“可变变量”一词与函数式编程中的意思相同吗?

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

Stack Overflow用户
提问于 2017-06-22 08:01:08
回答 1查看 246关注 0票数 1

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

现在,我们可以给出规则的另一个原因,即在访问共享可变变量时,所有线程都必须在同一个锁上同步--以确保一个线程编写的值对其他线程是可见的。否则,如果线程读取一个变量而不持有适当的锁,它可能会看到一个陈旧的值。

以下是数字:

我很好奇这里“可变”的意思。根据我在函数式编程方面的知识,“不变”的意思是不可变的和可变的对立面。图中的变量x是作者所称的共享可变变量。X(一个整数或其他类似的)是可变的吗?

EN

回答 1

Stack Overflow用户

发布于 2017-06-22 14:01:53

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

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44693568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档