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>();
}
}
创建一个网吧类、网民类,模拟上机、下机操作:
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;