Java Concurrent包学习之ConcurrentHashMap
在Java concurrent包中有这么一个接口:ConcurrentMap。
ConcurrentMap继承自Map,并添加了几个新的原子方法: putIfAbsent、remove、replace
其方法摘要如下:
V
putIfAbsent(K key, V value)
如果指定键已经不再与某个值相关联,则将它与给定值关联。
boolean
remove(Object key, Object value)
只有目前将键的条目映射到给定值时,才移除该键的条目。
V
replace(K key, V value)
只有目前将键的条目映射到某一值时,才替换该键的条目。
boolean
replace(K key, V oldValue, V newValue)
只有目前将键的条目映射到给定值时,才替换该键的条目。
ConcurrentHashMap类是ConcurrentMap接口的一个实现类。
支持检索的完全并发和更新的所期望可调整并发的哈希表。
此类遵守与 Hashtable 相同的功能规范,并且包括对应于 Hashtable 的每个方法的方法版本。
不过,尽管所有操作都是线程安全的,但检索操作不 必锁定,并且不 支持以某种防止所有访问的方式锁定整个表。
此类可以通过程序完全与 Hashtable 进行互操作,这取决于其线程安全,而与其同步细节无关。
检索操作(包括 get)通常不会受阻塞,因此,可能与更新操作交迭(包括 put 和 remove)。
检索会影响最近完成的 更新操作的结果。
对于一些聚合操作,比如 putAll 和 clear,并发检索可能只影响某些条目的插入和移除。
类似地,在创建迭代器/枚举时或自此之后,Iterators 和 Enumerations 返回在某一时间点上影响哈希表状态的元素。它们不会 抛出 ConcurrentModificationException。不过,迭代器被设计成每次仅由一个线程使用。
这允许通过可选的 concurrencyLevel 构造方法参数(默认值为 16)来引导更新操作之间的并发,该参数用作内部调整大小的一个提示。表是在内部进行分区的,试图允许指示无争用并发更新的数量。因为哈希表中的位置基本上是随意的,所以实际的并发将各不相同。理想情况下,应该选择一个尽可能多地容纳并发修改该表的线程的值。使用一个比所需要的值高很多的值可能会浪费空间和时间,而使用一个显然低
相关文档:
线程的创建和启动
Java语言已经内置了多线程支持,所有实现Runnable接口的类都可被启动一个新线程,新线程会执行该实例的run()方法,当run()方法执行完毕后,线程就结束了。一旦一个线程执行完毕,这个实例就不能再重新启动,只能重新生成一个新实例,再启动一个新线程。
Thread类是实现了Runnable接口的一个实例,它代表 ......
最近需要做一些JAVA底层操作,为了尽可能提高效率做了如下测试。
在同一个类中建立普通的PUBLIC方法和PUBLIC STATIC 方法两种,并使用JUnit进行多次循环。最终证明使用对象的方式调用效率高。
上结果。
起始时间Fri Mar 05 10:15:37 CST 2010结束时间Fri Mar 05 10:15:38 CST 2010时间间隔891
起始时间Fri ......
java回调机制
回调概念:
软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用;回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;异步调用是一种类似 ......
public class bubblesort {
public static void main(String[] args) {
int array[]=new int[]{1,5,9,4,6,2};
int m;
for(int i=0;i<array.length;i++){
System.out.print(arra ......
一、new
使用java的关键字new来创建对象实例。构造函数链中的所有构造函数都会被自动调用。
Java代码:
CreateInstance instance = new CreateInstance ();
二、clone
构造函数不被自动调用。
Java代码:
......