不可变对象

ningbohezhijun ningbohezhijun 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
最近在看《Java 7并发编程实战手册》,遇到了个问题,希望大家帮忙。

问题是关于:不可变对象与线程安全,代码如下


@Immutable
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);
}
}

可以看到OneValueCache是不可变对象。


@ThreadSafe
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为volatile,所以最新值立即能让其它线程可见
cache = new OneValueCache(i, factors);
}
encodeIntoResponse(resp, factors);
}
}

但是我又该如何理解VolatileCachedFactorizer类是线程安全的。总感觉理不清,也不知道去理清这个问题的重点是哪里。
书上是这么解释的(我没有理解):
与cache相关的操作不会相互干扰,因为OneValueCache是不可变的,并且在每条相应的代码路径中只会访问它一次。通过使用包含多个状态变量的容器对象来维持不变性条件,并使用一个volatile类型的引用来确保可见性,使得VolatileCachedFactorizer在没有显示地使用锁的情况下仍然是线程安全的。

请点拨我一下,谢谢!
...全文

相关推荐

浅谈Python中的可变对象和不可变对象

什么是可变/不可变对象 不可变对象,该对象所指向的内存中的值不能被改变。当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址。 可变对象,该对象所指向的内存中的值可以被改变。变量(准确的说是引用)改变后,实际上是其所指的值直接发生改变,并没有发生复制行为,也没有开辟新的出地址,通俗点说就是原地改变。 Python中,数值类型(int和float)、字符串str、元组tuple都是不可变类型。而列表list、字典dict、集合set是可变类型。 还是看代码比较直观。先看不可变对象 不可变对象的例子 先说明一点is 就是判断两

weixin_38624332

为什么Java字符串是不可变对象?

本文主要来介绍一下Java中的不可变对象,以及Java中String类的不可变性,那么为什么Java的String类是不可变对象?让我们一起来分析一下。   答案一:   流行的Java面试题之一是:什么是不可变对象(immutable object),不可变对象有什么好处,在什么情况下应该用,或者更具体一些,Java的String类为什么要设成immutable类型?   不可变对象,顾名思义是创建后不可以改变的对象,典型的例子是Java中的String类。   String s="ABC";   s.toLowerCase();   如上s.toLowerCase()并没有改变

weixin_38653508

Java不可变对象整洁之道

在 Java 语言中,不可变类指的是这个类的实例是不可修改的,在创建类实例时我们需要指定这个类所有的属性值,而且在以后的生命周期中这些属性值都不能重新赋值。经验丰富的你可能已经知道 Java 中已经存在一些不可变类型,例如 String,BigInteger 和 BigDecimal 等。   不可变类对于开发者来说有如下好处:   · 易于设计,实现和使用   · 使用过程中不容易导致出错   · 更加的安全,可以随意地共用   · 天然具备线程安全性,无需增加额外的同步操作   本文的目标是介绍 Java 开发中构建和自动生成不可变类的几种整洁的方式,其中着重介绍自动生成不可变

weixin_38608379

详细分析Python可变对象和不可变对象

主要介绍了Python可变对象和不可变对象的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下

weixin_38688371

Python可变对象与不可变对象

Python里和None比较时,为什么是 is None 而不是 == None 呢? 这是因为None在Python里是个单例对象,一个变量如果是None,它一定和None指向同一个内存地址。而 == None背后调用的是__eq__,而__eq__可以被重载

大鱼-瓶邪
评论 1
收藏 已收藏
分享
返回顶部
ningbohezhijun
Java EE 67,535 成员 225,843 内容