您的位置:首页 > 其它

Concurrenthasmap

2017-06-29 17:50 513 查看

Concurrenthasmap

首先我们来说一下hasmap和hastable的区别hasmap是线程非安全的,hastable是线程安全的

效率低下的HashTable容器

hastable 多线程访问时,将并行转换成串行,一次只能有一个访问,当操做完之后,下一个线程才能进入,效率低,当一个线程访问HashTable的同步方法时,其他线程访问HashTable的同步方法时,可能会进入阻塞或轮询状态。如线程1使用put进行添加元素,线程2不但不能使用put方法添加元素,并且也不能使用get方法来获取元素,所以竞争越激烈效率越低。还存在复合操作上的安全问题。(符合操作:例如:若不存在则添加,先判断是否存在,在进行添加,如果在判断之后操作权限被剥夺及contants存在锁,put存在锁,但是contants和put同时操作时不存在锁,也存在安全问题)

Concurrenthasmap

在jdk1.5提供了线程安全的容器类,其中Concurrenthasmap是比较常用的,提供了“锁分段”机制

ConcurrentHashMap是由Segment数组结构和HashEntry数组结构组成。Segment是一种可重入锁ReentrantLock,在ConcurrentHashMap里扮演锁的角色,HashEntry则用于存储键值对数据。一个ConcurrentHashMap里包含一个Segment数组,Segment的结构和HashMap类似,是一种数组和链表结构, 一个Segment里包含一个HashEntry数组,每个HashEntry是一个链表结构的元素, 每个Segment守护者一个HashEntry数组里的元素,当对HashEntry数组的数据进行修改时,必须首先获得它对应的Segment锁。

锁分段:首先我们来了解一下,其中的一个并发级别Concurrentlevel默认为16,因为默认有16个分段,每个段有独立的表,每个表中有链表。每个段是一个独立的锁(当多个线程并发访问时,访问不同的段,不会发生冲突,所以可以有并行的效果,效率要高,还提供了符合操作的方法)



之前我们使用collections类提供的同步方法,将每个方法加了一个synchronized关键字

List list = Collections.synchronizedList(new ArrayList<>());
将每个方法加了一个synchronized关键字


jdk1.8分段锁被取消了,采用了CAS算法(不会阻塞)

未完待续。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息