Java线程安全策略

线程安全策略

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

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

  • 对象创建以后其状态就不能修改。
  • 对象的所有域都是fina类型。
  • 对象是正确创建的(在对象创建期间,this引用没有逸出)
并发编程实践中,this引用逃逸("this"escape)是指对象还没有构造完成,它的this引用就被发布出去了

final

final关键字:类,方法,变量。
  • 修饰类
不能被继承,final类中的成员属性可以根据需要设置成 final,但是 final类中所有的成员方法都被隐式的指定为 final,一般不建议将类设置成 final.
  • 修饰方法
锁定方法不能被继承类修改
  • 修饰变量
基本数据类型变量,初始化后就不能被修改。引用类型变量,在初始化后就不能指向别的引用。
//线程不安全

package com.rumenz.task.single;

import com.google.common.collect.Maps;
import java.util.Map;

public class ImmutableExample1 {

    private final static Integer a=1;
    private final static Integer b=2;

    //指向的引用不能被修改,但是map里面的值可以修改
    private final static Map map= Maps.newHashMap();


    static {
        map.put(1, 1);
    }

    public static void main(String[] args) {
       //a=10; 编译期报错
       //b=20; 编译期报错
       map.put(2, 2); //线程不安全
    }
}

Collections

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

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

//线程安全
package com.rumenz.task.single;

import com.google.common.collect.Maps;

import java.util.Collections;
import java.util.Map;


public class ImmutableExample1 {

    private final static Integer a=1;
    private final static Integer b=2;

    //指向的引用不能被修改,但是map里面的值可以修改
    private  static Map map= Maps.newHashMap();


    static {
        map.put(1, 1);
        //处理后map是不可以被修改的
        map= Collections.unmodifiableMap(map);
    }

    public static void main(String[] args) {
       //允许操作,但是操作会报错
       map.put(2, 2);
    }
}


Exception in thread "main" java.lang.UnsupportedOperationException
    at java.util.Collections$UnmodifiableMap.put(Collections.java:1457)
    at com.rumenz.task.single.ImmutableExample1.main(ImmutableExample1.java:31)

Collections.unmodifiableMap源码

public class Collections {
    public static  Map unmodifiableMap(Map m) {
        return new UnmodifiableMap<>(m);
    }
    private static class UnmodifiableMap implements Map, Serializable {
        @Override
        public boolean remove(Object key, Object value) {
            throw new UnsupportedOperationException();
        }

        @Override
        public boolean replace(K key, V oldValue, V newValue) {
            throw new UnsupportedOperationException();
        }
    }
}

Guava

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

ImmutableXXX:Collection、List、Set、Map...


   com.google.guava
   guava
   23.0
//线程安全

public class ImmutableExample3 {

    private final static ImmutableList list = ImmutableList.of(1, 2, 3);
    
    private final static List lists = ImmutableList.of(1, 2, 3);

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

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

    private final static ImmutableMap map2 = ImmutableMap.builder()
            .put(1, 2).put(3, 4).put(5, 6).build();

    public static void main(String[] args) {
        System.out.println(map2.get(3));
    }
}

你可能感兴趣的:(多线程,java)