招生合作| 投诉/建议

400-888-4849

全国统一学习专线 8:30-21:00

广州拓胜科技新闻中心 NEWS

Java并发编程与不变性

发布时间:2017-12-28 13:39:05 已帮助:281人 来源:广州拓胜科技

  Java并发编程与不变性,以下是关于java程序语言的知识点,java作为目前主流的计算机开发语言之一,java工程师的待遇也是IT职业中前列的,所以说学习java的前途是无可限量的。
  Java并发编程与不变性:
  将一连串行为组织为一个原子操作以不变性条件,或者使用同步机制可见性,以防止读到失效数据或者对象变为不一致状态,这些问题都是因为共享了可变的数据。
  如果我们能数据不可变,则这些复杂的问题就自然不用去考虑了。
  不可变对象一定是线程安全的。
  说简单也简单,不可变对象只有一种状态,且由构造器控制。
  因此,判断不可变对象的状态变得特别简单。
  当我们共享一个可变对象,其状态的改变行为都是难以预料的,尤其是作为参数传给了可覆盖的方法时,更糟糕的是这些client代码都可以保留该对象的引用,也就是说状态改变的时机也同样难以预料。
  相对于可变对象的共享,不可变对象的共享则简单很多,而且几乎不用考虑弄一个快照。
  于是我们现在有了一个新的问题:如何让状态不可变?
  对于"不可变"这一说法无论是JLS还是什么地方都没有明确的定义,但不可变绝对不仅仅是加个final修饰那么简单,比如final修饰的field引用的是一个可变对象,而final的仅仅是引用的指向不会发生变化。
  没错,不可变对象和不可变的对象引用是两码事。
  对于如何构建一个不可变对象,我们有三个条件(虽然说是"条件",但并不是那么硬性的,可以算是某种建议):
  对象创建后状态不可变
  对象的所有field都是final
  创建期间没有逸出自身引用,对象的创建正确。
  关于上面三条,这里举一个例子:
  public final class ThreeStooges {
  private final Set stooges = new HashSet();
  public ThreeStooges() {
  stooges.add("Moe");
  stooges.add("Larry");
  stooges.add("Curly");
  }
  public boolean isStooge(String name) {
  return stooges.contains(name);
  }
  public String getStoogeNames() {
  List stooges = new Vector();
  stooges.add("Moe");
  stooges.add("Larry");
  stooges.add("Curly");
  return stooges.toString();
  }
  }
  让我们检查一下是否满足三个条件:
  对象创建后状态不可变,是否有变化? 我们首先是用private修饰了stooges,接着提供的两个公有方法中个方法是返回boolean而第二个方法getStoogeNames中我们重新创建了一个stooges且相同的逻辑而不是直接引用stooges field。
  对象的所有field都是final,很明显,我们用了final进行描述以防止对象状态在对象生命周期内改变其引用。
  创建期间没有逸出自身引用,在stooges声明时我们就指定了引用,并在构造函数中将其初始化,不会有外来方法可以引用到该状态并将其改编。
  不得不说这个final修饰是关键。
  通常我们对final关键字最直观的印象是,如果一个用final修饰的对象引用的指向是不会改变的(发现这话怎么说都很难表达清楚,但是你懂的),但即使引用了可变的实例,就判断状态而言,加了final就可以简化不少,分析基本不可变的对象总比分析完全可变的对象来得容易多了吧....
  而final和synchronized关键字那样也有多个语义,就是——能确保初始化过程的安全性,从而可以自由共享,不需要进行同步处理(这个同步处理不包括可见性)。
  下面是一段用final(更确切地说应该是不可变性)了操作原子性(以可变性条件)一段例子。
  某个Servlet接收参数后将参数传入factor方法对其进行运算并将结果进行响应。
  假设这个factor方法非常耗时,于是我们想出了一个方法暂时缓解这一状况,即下一次请求的参数和上一次请求的参数相同则响应缓存中的结果。
  也就是说每一次请求时我们多了一个步骤,也就是需要判断请求的数字是否和缓存中的一样,如果不同则重新计算,而这一段并不是原子操作,并发出现时会出现破坏可变性条件的情况。

以上就是 广州拓胜科技 小编为您整理Java并发编程与不变性的全部内容,更多精彩请 在线咨询
也可以拨打咨询电话: 400-888-4849 让在线老师为你详细解答


关于我们 | 联系我们 | 广州拓胜科技 地址:广东省广州市番禺区小谷围街外环东路232号 咨询电话:400-888-4849

CopyRight © 2010-2025 订课宝 版权所有. 未经授权,不得转载本站内所有内容。

沪ICP备16037964号-2

招生合作 版权/投诉 注册

网站地图 更新时间:2025-04-27