Java线程相关类

A.ThreadLocal类(泛型支持)-代表线程局部变量

        使用ThreadLocal类可以简化多线程编程时的并发访问,既为每一个使用该变量的线程提供一个变量副本,每一个线程可以改变自己的变量副本,等同于拥有自己的变量,各线程间互不影响。(ThreadLocal  Variable线程局部变量)

只提供了3个方法:

        T get():返回此线程局部变量中当前线程副本中的值。

        void remove():删除此线程局部变量中当前线程的值。

        void set(T value):设置此线程局部变量中当前线程副本中的值。

代码举例:


Java线程相关类_第1张图片
共享账户类


Java线程相关类_第2张图片
并发访问的线程


Java线程相关类_第3张图片
测试


Java线程相关类_第4张图片
结果



        最终我们可见,被ThreadLocal封装的变量name被3个线程(main主线程也算在内)并发访问,而且线程甲和线程乙修改了变量,但是各个线程之间并无任何影响!

        于是我们联想到之前的线程同步机制,这是另一种机制,与同步机制不同的机制,各个线程共享同一资源无冲突,而同步机制需要锁来保证资源的一致性,达到线程之间通信的功能!



B.包装线程不安全的集合

        集合中有线程不安全的集合,ArrayList、LinkedList、HashList、TreeSet、HashMap等这些集合都不是线程安全的(多线程向这些集合放入一个元素的时候)!所以我们需要用到Collections提供的静态方法将这些集合包装成线程安全的集合:

            Collection         synchronizedCollection c >:返回指定Collection对应的线程安全的Collection。

        static        List    synchronizedList list>:返回指定List对应的线程安全的List对象。

        static      Map    synchronizedMap m>:返回指定Map对应的线程安全的Map对象。

        static        Set    synchronizedSet set>:返回指定Set对应的线程安全的Set对象。

        static        SortedMap    synchronizedSortedMap sm>:返回指定SortedMap对应的线程安全的SortedMap对象。

        static    SortedSet    synchronizedSortedMap ss>:返回指定SortedMap对应的线程安全的SortedMap对象。



注意:如果需要把某个集合包装成线程安全的集合,则需要在集合创建后立即包装,如下:




c.线程安全的集合

        有线程不安全的集合,当然也有线程安全的集合。java.util.concurrent包提供了映射表、有序表和队列的高效实现:

ConcurrentHashMapConcurrentSkipListMapConcurrentSkipListSetConcurrentLinkedQueue

这些集合通过复杂的算法,使得他们能够被多线程并发访问。

注意:被包装成线程安全的集合,在对它使用迭代器的时候,还是需要线程锁,否则会抛出异常。而线程安全的集合迭代器返回的不一定是修改后的数据。


------------上一节“Java-线程池”-------------------

你可能感兴趣的:(Java线程相关类)