不变性

作者: 大海孤了岛 | 来源:发表于2017-04-12 15:53 被阅读13次
不可变对象一定是线程安全的

那么什么是不可变对象呢?

当满足一下条件时,对象才是不可变的。

  • 对象创建以后其状态就不能修改
  • 对象的所有域都是final类型
  • 对象是正确创建的(在对象的创建期间,this引用没有逸出)

我们回到之前因数分解的例子,通过构造一个不可变类来实现同步:

class OneValueCache{
    private final BigInteger lastNumber;
    private final BigInteger[] lastFactors;

    public OneValueCache(BigInteger i, BigInteger[] factors){
        lastNumber = i;
        lastFactors = Arrays.copyOf(factors, factors.length);
    }

    public BigInteger[] getFactors(BigInteger i){
        if (lastNumber == null || !lastNumber.equals(i)) {
            return null;
        } else {
            return Arrays.copyOf(lastFactors, lastFactors.length);
        }
    }
}

public class VolatileCachedFactorizer implements Servlet{
    private volatile OneValueCache cache = 
        new OneValueCache(null,null);

    public void service(ServletRequest req, ServletResponse resp){
        BigInteger i = extractFromRequest(req);
        BigInteger[] factors = cache.getFactors(i);
        if (factors == null) {
            factors = factor(i);
            cache = new OneValueCache(i, value);
        }
        encodeIntoResponse(resp, factors); 
    }
}

我们可以看到OneValueCache为一个不可变类,并且我们在创建时,使用volatile关键字声明,这样保证了线程安全性和可见性。

但要注意的一点是:
如果final类型的域所指向的是可变对象,那么在访问这些域所指向的对象的状态时仍然需要同步

public final class ThreeStooges {
  private final Set<String> stooges = new HashSet<String>();

  public ThreeStooges() {
    stooges.add("Moe");
    stooges.add("Larry");
    stooges.add("Curly");
  }

  public boolean isStooge(String name) {
    return stooges.contains(name);
  }

  public synchronized Set<String> getStooges(){
    return stooges;
  }
}

如上,stooges变量为可变对象,因此,如果我们需要对其访问时,需要加上synchronized关键字来保证同步。

相关文章

  • 2019-06-06

    "ISO" 不变性 胡亦鸣 “ISO 不变性” 这个...

  • 详解 Go 中的不可变类型

    Golang 中的不变性 如何利用不变性来增强你的 Golang 应用程序的可读性和稳定性 不变性的概念非常简单....

  • Harris特征点检测器-兴趣点检测

    1. 简介 图形图像领域将特征点称为兴趣点或者角点,这些点通常具有选择不变性、光照不变性和视角不变性。Harris...

  • 不变性

    不可变对象一定是线程安全的 那么什么是不可变对象呢? 当满足一下条件时,对象才是不可变的。 对象创建以后其状态就不...

  • String

    三大核心机制 不变性、常量池优化、final 不变性:是一个immutable(不变模式)模式的对象,不变模式的主...

  • Immutability模式

    不变性(Immutability)模 式。所谓不变性,简单来讲,就是对象一旦被创建之后,状态就不再发生变化。换句话...

  • 神经网络——最大池化层的使用

    1 池化的目的 实施池化的目的:(1) 降低信息冗余;(2) 提升模型的尺度不变性、旋转不变性;(3) 防止过拟合...

  • java入门教程(三)基本类型

    java基本类型 java基本类型具有不变性,所谓不变性是指基本类型所占存储空间的大小不随机器硬件架构的变化而变化...

  • 科学结构的表征与不变性

    《科学结构的表征与不变性》考察了集合论方法是如何提供这样一种指称框架的,全书内容涵盖公理化方法、表征、不变性、概率...

  • 你有没有列过投资清单?

    投资思想大概可以分为两类:赌未来的不变性和赌未来的变革性,巴菲特、查理芒格的思想偏向于投资未来的不变性。最近跟着《...

网友评论

    本文标题:不变性

    本文链接:https://www.haomeiwen.com/subject/bbymattx.html