WhatAKitty Daily

A Programmer's Daily Record

Java并发集合

WhatAKitty   阅读次数loading...

介绍

对一些并发包下的集合做一些特殊性介绍。

ConcurrentHashMap

CocurrentHashMap不能被加锁来执行独占式访问,因此无法使用客户端加锁来创建新的院子操作

存在某些局限性,无法使用客户端加锁的形式,来保证独占式访问,例如:

1
2
3
4
5
6
7
// since jdk 1.7
Map<String, Object> concurrentmap = new CocurrentHashMap<>();
sychronized(concurrentmap) { ①
if (!concurrentmap.containsKey('key')) {
concurrentmap.put('key', new Object());
}
}

上述的代码,代码同步块①内的代码并不能保证其他在执行的时候,阻塞其他线程对于concurrentmap的更新操作。
比如,在获取concurrentmap对象的对象锁后执行①内的代码的时候,有如下代码可以同时执行更新操作:

1
concurrentmap.put('key', new Object());

这是由于,concurrentmap内部的锁(JDK1.7的分段锁/JDK1.8的Node对象锁)与客户端锁定的锁不是同一个锁。Java只有在对同一个锁操作,才可以阻塞其他线程的操作。