线程相关类

 一、ThreadLocal类
        在JDK5后ThreadLocal引入了泛型的支持,通过使用ThreadLocal可以简化多多线程的编程时是并发访问,使用这个工具类可以帮我们更好的实现多线程。
        ThreadLocal,是Thread Local Variable(线程的局部变量)的意思。线程局部变量功能非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,
        是每一个线程都可以独立的改变自己的副本,而不会和其他线程的副本冲突。
        ThreadLocal提供常用方法:
            A、T get():返回此线程局部变量中当前线程副本中的值
            B、void remove():删除此线程局部变量中当前线程副本中的值
            C、void set(T value):设置此线程局部变量中当前线程副本中的值
        ThreadLocal和其他所有同步机制都是为了解决多线程中对同一变量的访问冲突,在普通的同步机制中,是通过对象加锁来实现多个线程对同一变量的安全访问的。
        在这种情形下,该变量是多个线程共享的,所以要使用这种同步机制需要很细致的分析在什么时候对变量进行读写,
        上面时候需要锁定某个对象,什么时候释放对象锁等。
        在这种情况下系统并没有将这份资源复制多份,只是采用了案情机制来控制队这份资源的访问而已。
        ThreadLocal就从另一个角度来解决多线程的并发访问,ThreadLocal将需要并发访问的资源复制出多份,每个线程拥有一份资源,每个线程都拥有自己的资源副本,
        从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的对象,在编写多线程代码时,可以把不安全的整个变量封装进ThreadLocal,
        或者把该对象与现场相关的状态使用ThreadLocal保存。
        ThreadLocal并不能代替同步机制,两者面向的问题领域不同。同步机制是为了同步多个线程对相同资源的并发访问,是多个线程之间进行通信的有效方式;
        而ThreadLocal是隔离多个线程的数据共享,从根本上避免了多个线程之间共享资源(变量),也就不需要对多个线程进行同步了。
        通常认为:如果需要进行多个线程之间的共享资源,已到达线程之间的通信功能,就使用步机制,如果仅仅需要隔离多个线程之间的共享冲突,就用ThreadLocal。
    
    二、包装线程不安全集合
        当用多线程操作集合时,对线程不安全的集合进行操作容易破坏集合数据的完整性。
        A、<T> Collection<T> synchronizedCollection(Collection<T> c):返回指定collection对应的线程安全的collection
        B、static <T> List<T> synchronizedList(List<T> list):返回指定List对应的现场安全的List对象
        C、static <K, V> Map<K, V> synchronizedMap(Map<K, V> m):返回指定Map对象对应的现场安全的Map对象
        D、static <T> Set<T> synchronizedSet(Set<T> s):返回指定Set对应的线程安全的Set
        E、static <K, V> SortedMap<K, V> synchronizedSortedMap(SortedMap<K, V> m):返回指定SortedMap对象所对应线程安全的SortedMap对象
        F、static <K, V> SortedSet<K, V> synchronizedSortedSet(SortedSet<K, V> m):返回指定SortedSet对象所对应线程安全的SortedSet 对象
        使用线程安全的HashMap对象:
        HashMap map = Collections.synchronizedMap(new HashMap());
        注意:如果需要把某个集合包装成线程安全的集合,则应该在创建之后立即包装,包装后就是线程安全的HashMap对象了。
 
    三、线程安全的集合
        在JDK5后提供了java.util.concurrent包的ConcurrentHashMap、ConcurrentLinkedQueue两个支持并发访问的集合,
        它们分别代表了支持并发访问的HashMap和支持并发访问的Queue。默认都支持多线程并发写入,写入操作是线程安全的,读取不必锁定。
        这两个集合采用了复杂的算法,他们是永远都锁不住的集合。
        当多线程共享访问一个集合时,ConcurrentLinkedQueue最合适不过,Queue不允许为null元素。
        Quee实现了多线程的高效访问,多条线程访问ConcurrentLinkedQueue集合是无需等待。
        ConcurrentHashMap默认支持16条线程并发访问,当有超过16条线程并发访问就需要等待。
        但可以设置concurrentLevel构造方法参数(默认16)来支持更多的线程并发数量。
        与HashMap和普通集合不同的是,当我们用迭代器变量ConcurrentHashMap、ConcurrentLinkedQueue时,
        如果在迭代器创建后对集合元素的修改是不会在迭代器中做出修改,也不会出现异常。
        如果用Collection作为集合对象时,如果对象在创建迭代器后发生变化修改,就会引发ConcurrentModificationException
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值