线程安全-不可变对象

不可变对象

不可变对象需要满足的条件

对象创建状态后其状态就不能修改

对象所有域都是final类型

对象是正确创建的(在对象创建期间,this引用没有溢出)

final关键:修饰类、方法、变量

修饰类不能被继承

修饰方法不能被重写,一个类的private方法会隐士的指定为final方法

修饰变量不能被更改,基本数据类型变量,引用类型变量

实例代码:

public class ImmutableExample1 {

    public static final Integer a=1;
    public static final Integer b=2;
    public static final Map<String,Object> maps= Maps.newHashMap();
  
  	static{
      maps.put("a","a");
      maps.put("b","b");
      maps.put("c","c");
    }

    public static void main(String[] args) {
       // a=3;
       // b=4;
       // maps=Maps.newHashMap();
      maps.put("c","d");
    }
  	private void test(final int a){
        //a=2;
    }
}

注:基本数据类型是不允许修改的,对于引用类型它不允许做的是一旦赋值了以后就不允许指向新的对象,但是却允许修改里面的值,这个时候会引发线程安全问题

其它不可变对象创建方法

Collections.unmodifiableXXXX:Collections、List、Set、Map都有对应的不可变方法

Guava:ImmutableXXX:Collections、List、Set、Map

实例代码

    public static final Integer a=1;
    public static final Integer b=2;
    public static Map<String,Object> maps= Maps.newHashMap();

    static{
        maps.put("a","a");
        maps.put("b","b");
        maps.put("c","c");
        maps= Collections.unmodifiableMap(maps);
    }

    public static void main(String[] args) {
//        a=3;
//        b=4;
//        maps=Maps.newHashMap();
        maps.put("c","d");
        System.out.println("maps:"+maps.get("c"));
    }

注:使用unmodifiableMap可以put值但是在启动的时候会抛出异常 java.lang.UnsupportedOperationException

private static final ImmutableList<Integer> list=ImmutableList.of(1,2,3);
private static final ImmutableSet<Integer> set=ImmutableSet.copyOf(list);

public static void main(String[] args) {
    list.add(4);
}

注:ImmutableList启动会抛出异常java.lang.UnsupportedOperationException

private static final ImmutableMap<Integer,Integer> maps=ImmutableMap.<Integer,Integer>of(1,1,2,2);
    private static final ImmutableMap<Integer,Integer> maps1=ImmutableMap.<Integer,Integer>builder().put(1,1)
            .put(2,2).build();

注:ImmutableMap两种赋值的方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值