并发与高并发课程学习笔记(4)

不可变对象

1.final关键字: 类,方法,变量

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

    2).修饰方法: 1.锁定方法不被继承类修改.2.效率

    3).修饰变量: 基本数据类型变量,引用变量

其中final 修饰的基本类型变量,线程是安全的,但是在修饰比如map引用数据类型的时候,就会出现问题

@Slf4j

@NotThreadSafe

public class ImmutableExample1 {

private static final Mapmap = Maps.newHashMap();

static {

map.put(1,2);

map.put(3,4);

map.put(5,6);

}

public static void main(String[] args) {

map.put(1,3);

log.info("{}",map.get(1));

}

}

这里map用final修饰,但是还是可以修改里面的值,因此不能保证为不可变对象

那么有没有能够保证引用对象为不可变对象的方法呢,当然是有的


可以引用对象等于Collections.unmodifiableXX

eg: map = Collections.unmodifiableMap(map);


也可以使用guava的immutable类

eg:

private final static ImmutableListlist = ImmutableList.of(1,2,3);

private final static ImmutableSetset = ImmutableSet.copyOf(list);

private final static ImmutableMapmap = ImmutableMap.of(1,2,3,4);

private final static ImmutableMapmap2 = ImmutableMap.builder()

.put(1,2).put(2,3).build();

你可能感兴趣的:(并发与高并发课程学习笔记(4))