ConcurrentHashMap能否被手动加锁来执行独占式访问

lxraiyl 2014-09-29 03:48:09
《JAVA并发编程实践》一书中,关于ConcurrentHashMap介绍时有这样一句话“由于ConcurrentHashMap不能被加锁来执行独占式访问,因此我们无法使用客户端加锁来创建新的原子操作”。这句话是怎么理解呢?是不是如果用下面这段代码加锁是无效的,

public class Test{
private static ConcurrentHashMap<String,String> map = new ConcurrentHashMap<String,String>();

public void test(){
synchronied(map){
//这里对map加锁是不是无效的,或者是错误的
}
}
}
...全文
499 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
本人dddd牛仔 2018-07-02
  • 打赏
  • 举报
回复
貌似挖坟了,刚好看到这个问题,顺便回答一下,上述说的有点不太清楚。

CocurrentHashMap无法使用客户端加锁的形式,来保证独占式访问,例如:

```java
// since jdk 1.7
Map<String, Object> concurrentmap = new CocurrentHashMap<>();
sychronized(concurrentmap) { ①
if (!concurrentmap.containsKey('key')) {
concurrentmap.put('key', new Object());
}
}
```

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

```java
concurrentmap.put('key', new Object());
```

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

具体看这个:https://xuqiang.me/Java%E5%B9%B6%E5%8F%91%E9%9B%86%E5%90%88.html
william_yao 2014-09-30
  • 打赏
  • 举报
回复
mark下,回去给你答
humanity 2014-09-30
  • 打赏
  • 举报
回复
这说的锁似乎对 ConcurrentHashMap 来说完全无视的外部锁,自己并不使用啊。像是搞混淆了。分段锁是它内部使用的锁,你的代码在外部把它当然一个普通对象来锁,这时锁的代码区域并不在 ConcurrentHashMap 内部也没用使用它内部的锁啊,也就与它没有关系。
whos2002110 2014-09-29
  • 打赏
  • 举报
回复
可以锁
lxraiyl 2014-09-29
  • 打赏
  • 举报
回复
结贴,我已经测过了,可以对其进行独占式访问
lxraiyl 2014-09-29
  • 打赏
  • 举报
回复
引用 1 楼 u010475149 的回复:
你这连入门都没有呢。ConcurrentHashMap使用了一个分段锁。
我知道是分段锁,我问的是能够对ConcurrentHashMap手动加独占锁,不是用它的分段锁。
as1dasd11 2014-09-29
  • 打赏
  • 举报
回复
你这连入门都没有呢。ConcurrentHashMap使用了一个分段锁。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧