Java中的并发编程集合使用(4)

for (Map.Entry<String, Object> me : chm.entrySet()) {
            System.out.println("key:" + me.getKey() + ",value:" + me.getValue());
        }

/**
        * ArrayList 的一个线程安全的变体,其中所有可变操作(add、set 等等)都是通过对底层数组进行一次新的复制来实现的。
        *
        * 这一般需要很大的开销,但是当遍历操作的数量大大超过可变操作的数量时,这种方法可能比其他替代方法更有效。
        * 在不能或不想进行同步遍历,但又需要从并发线程中排除冲突时,它也很有用。“快照”风格的迭代器方法在创建迭代器时使用了对数组状态的引用。
        * 此数组在迭代器的生存期内不会更改,因此不可能发生冲突,并且迭代器保证不会抛出 ConcurrentModificationException。
        * 创建迭代器以后,迭代器就不会反映列表的添加、移除或者更改。在迭代器上进行的元素更改操作(remove、set 和 add)不受支持。
        * 这些方法将抛出 UnsupportedOperationException。
        *
        * 允许使用所有元素,包括 null。
        *
        * 内存一致性效果:当存在其他并发 collection 时,将对象放入 CopyOnWriteArrayList 之前的线程中的操作 happen-before 随后通过另一线程从 CopyOnWriteArrayList 中访问或移除该元素的操作。
        */
        CopyOnWriteArrayList<String> cwal = new CopyOnWriteArrayList<String>();
        /**
        * 对其所有操作使用内部 CopyOnWriteArrayList 的 Set。它共享以下相同的基本属性:
        *
        * 它最适合于具有以下特征的应用程序:set 大小通常保持很小,只读操作远多于可变操作,需要在遍历期间防止线程间的冲突。
        * 它是线程安全的。
        * 因为通常需要复制整个基础数组,所以可变操作(add、set 和 remove 等等)的开销很大。
        * 迭代器不支持可变 remove 操作。
        * 使用迭代器进行遍历的速度很快,并且不会与其他线程发生冲突。在构造迭代器时,迭代器依赖于不变的数组快照。
        */
        CopyOnWriteArraySet<String> cwas = new CopyOnWriteArraySet<String>();
    }
}

DelayQueue例子

创建一个网吧类、网民类,模拟上机、下机操作:

package com.ietree.basicskill.mutilthread.concurrent;

import java.util.concurrent.DelayQueue;

/**
 * Created by Root on 5/11/2017.
 */
public class WangBa implements Runnable {
    /**
    * Delayed 元素的一个无界阻塞队列
    *
    * 只有在延迟期满时才能从中提取元素。该队列的头部 是延迟期满后保存时间最长的 Delayed 元素。
    * 如果延迟都还没有期满,则队列没有头部,并且 poll 将返回 null。
    * 当一个元素的 getDelay(TimeUnit.NANOSECONDS) 方法返回一个小于等于 0 的值时,将发生到期。
    * 即使无法使用 take 或 poll 移除未到期的元素,也不会将这些元素作为正常元素对待。
    * 例如,size 方法同时返回到期和未到期元素的计数。此队列不允许使用 null 元素。
    */
    private DelayQueue<Wangmin> queue = new DelayQueue<Wangmin>();

public boolean yinye = true;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/642c8af85655de5cfce210bc0b351b10.html