zoukankan      html  css  js  c++  java
  • java核心学习(二十七) 多线程---线程相关类

    一、ThreadLocal类

      变量类型可以被声明为ThreadLocal<T>,作用是在并发处理该变量时会为每一个使用该变量的线程都提供一个该变量的副本

      该类提供了三个方法:

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

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

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

    二、包装线程不安全的集合

      使用Collections的静态synchronizedXxx(Xxx<T> x)方法,可以返回Xxx集合对应的线程安全的集合,返回类型为Xxx<T>。

      例如:

    HashMap m = Collections.synchronizedMap(new HashMap());

    三、 线程安全的集合类

      除了传统的Hashtable和Vector等线程安全的集合类之外,java5 在java.util.concurrent包下还提供了大量支持高并发访问的集合接口与实现类

                                        

        这些集合类分为两大类:ConcurrentXxx,这种并发的集合类采用更复杂的算法保证永远不会锁住整个集合,因此在并发写入时有较好的性能。这种集合类在写入时会锁定,但是读取时却不锁定,相当于实现了·读者写者问题。

                   当多个线程访问一个公共集合时,ConcurrentLinkedQueue是不错的选择,该集合类不允许使用null,且ConcurrentLinkedQueue实现了多线程的高效访问,多线程访问该集合无需等待。

                   ConcurrentHashMap支持16个线程并发写入,当并发线程数超过16时,一些线程可能会等待,可以通过设置concurrencyLevel来设置支持的最大并发写入数。

                   当使用迭代器来遍历集合元素时,该迭代器无法实现创建迭代器之后集合元素所做的修改,但程序不会抛出异常。但是若对java.util包下的Collection作为集合对象时,创建迭代器后在改变集合元素,则会引发ConcurrentModificationException异常。

                   对于CopyOnWriteArrayList集合,进行读取操作时会直接读取集合本身而无需加锁和阻塞,但若进行写操作,则会在底层复制一份新的数组,然后对新的数组进行写入操作。这意味着读写操作不是同一个数组,读操作会很快,但是写操作的性能会受到复制数组的影响而变差。

  • 相关阅读:
    铁轨
    POJ 2385 -- Apple Catching
    POJ 3258 -- River Hopscotch
    POJ 1469 -- COURSES (二分匹配)
    POJ 2349 -- Arctic Network
    最小生成树
    NOIP200703守望者的逃离
    NOIP200706字符串的展开
    POJ 1036 -- Gangsters
    POJ 1952 -- BUY LOW, BUY LOWER
  • 原文地址:https://www.cnblogs.com/Theshy/p/7639958.html
Copyright © 2011-2022 走看看