并发与高并发课程学习笔记(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();