Vis*_*hal 4 java synchronization concurrenthashmap
静态ConcurrentHashmap是否需要使用同步块或锁进行外部同步?
是和不是。这取决于你在做什么。ConcurrentHashMap 对于它的所有方法(例如 get 和 put)都是线程安全的。但是,对于非原子操作来说,它不是线程安全的。这是执行非原子操作的方法的示例:
public class Foo {
Map<String, Object> map = new ConcurrentHashMap<String, Object>();
public Object getFoo(String bar) {
Object value = foo.get(bar);
if (value == null) {
value = new Object();
map.put(bar, foo);
}
return value;
}
}
Run Code Online (Sandbox Code Playgroud)
这里的缺陷是两个线程调用可能getFoo会接收不同的对象。请记住,在处理任何数据结构或类型时,即使像简单的数据结构或类型一样int,非原子操作始终需要外部同步。诸如 AtomicInteger 和 ConcurrentHashMap 之类的类有助于使一些常见操作成为线程安全的,但不能防止诸如上面的检查然后设置操作getFoo。
| 归档时间: |
|
| 查看次数: |
6553 次 |
| 最近记录: |