Java多线程之线程安全策略---不可变对象

一、不可变对象要满足以下几个条件:(1)对象创建以后状态不能修改;(2)对象所有域都时final类型;(3)对象是正确创建的(this引用没有逸出)

我们来介绍一下final,Collectons.unmodifiableXXX,Guava的ImmutableXXX

二、final

(1)修饰类:不能被继承

(2)修饰方法:锁定方法不被继承类修改

(3)修饰变量:基本类型变量,引用类型变量

一个类的private方法会隐式被指定为final方法。

final修饰变量,对于基本数据类型,数值在初始化之后不能被修改;如果是引用类型变量,则在对其初始化之后,便不能让它再【指向】另外一个对象。


final修饰的引用类型,只是不能指向另一个引用,但是里面的值可以修改。

三、Collectons.unmodifiableXXX,Guava的ImmutableXXX

指Collection/Set/List/Map等。

经过上面两个处理之后,变量是不可以被修改的。

看一下Collectons.unmodifiableXXX例子:

@Slf4j
public class UnmodifiableExample {

    private static Map<Integer, Integer> map = Maps.newHashMap();

    static {
        map.put(1, 2);
        map.put(3, 4);
        map.put(5, 6);
        map = Collections.unmodifiableMap(map);
    }

    public static void main(String[] args) {
        map.put(1, 3);
        log.info("{}", map.get(1));
    }
}

下面的map.put会报错。

unmodifiableXXX源码:


它是 生成了一个新的 map 在这个新的 map 里面,一旦初始化好了之后,这里面的很多方法都是不允许操作的,直接把里面的方法做成异常抛出,这样就把普通的 map 变成了不可修改的 map
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值