Java线程安全策略

线程安全策略

创建后状态不能被修改的对象叫做不可变对象. 不可变的对象天生就是线程安全的. 不可变对象的常量(变量)是在构造函数中创建的,既然它们的状态永远无法被改变,那么它们永远就是线程安全的。

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

  • 对象创建以后其状态就不能修改。
  • 对象的所有域都是fina类型。
  • 对象是正确创建的(在对象创建期间,this引用没有逸出)

并发编程实践中,this引用逃逸(”this”escape)是指对象还没有构造完成,它的this引用就被发布出去了

final

final关键字:类,方法,变量。

  • 修饰类

不能被继承,final类中的成员属性可以根据需要设置成final,但是final类中所有的成员方法都被隐式的指定为final,一般不建议将类设置成final.

  • 修饰方法

锁定方法不能被继承类修改

  • 修饰变量

基本数据类型变量,初始化后就不能被修改。引用类型变量,在初始化后就不能指向别的引用。

  1. //线程不安全
  2. package com.rumenz.task.single;
  3. import com.google.common.collect.Maps;
  4. import java.util.Map;
  5. public class ImmutableExample1 {
  6. private final static Integer a=1;
  7. private final static Integer b=2;
  8. //指向的引用不能被修改,但是map里面的值可以修改
  9. private final static Map<Integer,Integer> map= Maps.newHashMap();
  10. static {
  11. map.put(1, 1);
  12. }
  13. public static void main(String[] args) {
  14. //a=10; 编译期报错
  15. //b=20; 编译期报错
  16. map.put(2, 2); //线程不安全
  17. }
  18. }

Collections

java提供Collections工具类,在类中提供了多种不允许修改的方法。

Collections.unmodifiableXXX:Collection、List、Set、Map…

  1. //线程安全
  2. package com.rumenz.task.single;
  3. import com.google.common.collect.Maps;
  4. import java.util.Collections;
  5. import java.util.Map;
  6. public class ImmutableExample1 {
  7. private final static Integer a=1;
  8. private final static Integer b=2;
  9. //指向的引用不能被修改,但是map里面的值可以修改
  10. private static Map<Integer,Integer> map= Maps.newHashMap();
  11. static {
  12. map.put(1, 1);
  13. //处理后map是不可以被修改的
  14. map= Collections.unmodifiableMap(map);
  15. }
  16. public static void main(String[] args) {
  17. //允许操作,但是操作会报错
  18. map.put(2, 2);
  19. }
  20. }
  21. Exception in thread "main" java.lang.UnsupportedOperationException
  22. at java.util.Collections$UnmodifiableMap.put(Collections.java:1457)
  23. at com.rumenz.task.single.ImmutableExample1.main(ImmutableExample1.java:31)

Collections.unmodifiableMap源码

  1. public class Collections {
  2. public static <K,V> Map<K,V> unmodifiableMap(Map<? extends K, ? extends V> m) {
  3. return new UnmodifiableMap<>(m);
  4. }
  5. private static class UnmodifiableMap<K,V> implements Map<K,V>, Serializable {
  6. @Override
  7. public boolean remove(Object key, Object value) {
  8. throw new UnsupportedOperationException();
  9. }
  10. @Override
  11. public boolean replace(K key, V oldValue, V newValue) {
  12. throw new UnsupportedOperationException();
  13. }
  14. }
  15. }

Guava

谷歌的Guava中提供类似Java中的Collections

ImmutableXXX:Collection、List、Set、Map…

  1. <dependency>
  2. <groupId>com.google.guava</groupId>
  3. <artifactId>guava</artifactId>
  4. <version>23.0</version>
  5. </dependency>
  1. //线程安全
  2. public class ImmutableExample3 {
  3. private final static ImmutableList<Integer> list = ImmutableList.of(1, 2, 3);
  4. private final static List<Integer> lists = ImmutableList.of(1, 2, 3);
  5. private final static ImmutableSet set = ImmutableSet.copyOf(list);
  6. private final static ImmutableMap<Integer, Integer> map = ImmutableMap.of(1, 2, 3, 4);
  7. private final static ImmutableMap<Integer, Integer> map2 = ImmutableMap.<Integer, Integer>builder()
  8. .put(1, 2).put(3, 4).put(5, 6).build();
  9. public static void main(String[] args) {
  10. System.out.println(map2.get(3));
  11. }
  12. }
返回笔记列表
入门小站