A.ThreadLocal类(泛型支持)-代表线程局部变量
使用ThreadLocal类可以简化多线程编程时的并发访问,既为每一个使用该变量的线程提供一个变量副本,每一个线程可以改变自己的变量副本,等同于拥有自己的变量,各线程间互不影响。(ThreadLocal Variable线程局部变量)
只提供了3个方法:
T get():返回此线程局部变量中当前线程副本中的值。
void remove():删除此线程局部变量中当前线程的值。
void set(T value):设置此线程局部变量中当前线程副本中的值。
代码举例:
最终我们可见,被ThreadLocal封装的变量name被3个线程(main主线程也算在内)并发访问,而且线程甲和线程乙修改了变量,但是各个线程之间并无任何影响!
于是我们联想到之前的线程同步机制,这是另一种机制,与同步机制不同的机制,各个线程共享同一资源无冲突,而同步机制需要锁来保证资源的一致性,达到线程之间通信的功能!
B.包装线程不安全的集合
集合中有线程不安全的集合,ArrayList、LinkedList、HashList、TreeSet、HashMap等这些集合都不是线程安全的(多线程向这些集合放入一个元素的时候)!所以我们需要用到Collections提供的静态方法将这些集合包装成线程安全的集合:
<T> Collection<T> synchronizedCollection<Collection<T> c >:返回指定Collection对应的线程安全的Collection。
static <T> List<T> synchronizedList<List<T> list>:返回指定List对应的线程安全的List对象。
static <K,V> Map<K,V> synchronizedMap<Map<K,V> m>:返回指定Map对应的线程安全的Map对象。
static <T> Set<T> synchronizedSet<Set<T> set>:返回指定Set对应的线程安全的Set对象。
static <K,V> SortedMap<K,V> synchronizedSortedMap<SortedMap<K,V> sm>:返回指定SortedMap对应的线程安全的SortedMap对象。
static <T> SortedSet<T> synchronizedSortedMap<SortedSet<T> ss>:返回指定SortedMap对应的线程安全的SortedMap对象。
注意:如果需要把某个集合包装成线程安全的集合,则需要在集合创建后立即包装,如下:
c.线程安全的集合
有线程不安全的集合,当然也有线程安全的集合。java.util.concurrent包提供了映射表、有序表和队列的高效实现:
ConcurrentHashMap、ConcurrentSkipListMap、ConcurrentSkipListSet、ConcurrentLinkedQueue。
这些集合通过复杂的算法,使得他们能够被多线程并发访问。
注意:被包装成线程安全的集合,在对它使用迭代器的时候,还是需要线程锁,否则会抛出异常。而线程安全的集合迭代器返回的不一定是修改后的数据。