基本上,需要的是将请求同步到每个记录。 我能想到的一些代码是这样的:
//member variable
ConcurrentHashMap<Long, Object> lockMap = new ConcurrentHashMap<Long, Object>();
//one method
private void maintainLockObjects(long id){
lockMap.putIfAbsent(id, new Object());
}
//the request method
bar(long id){
maintainLockObjects(id);
synchronized(lockMap.get(id)){
//logic here
}
}
答案 0 :(得分:0)
查看ClassLoader.getClassLoadingLock
:
返回类加载操作的锁定对象。为了向后兼容,此方法的默认实现如下。如果此ClassLoader对象注册为并行功能,则该方法返回与指定类名关联的专用对象。否则,该方法返回此ClassLoader对象。
您的实现代码可能看起来很熟悉:
protected Object getClassLoadingLock(String className) {
Object lock = this;
if (parallelLockMap != null) {
Object newLock = new Object();
lock = parallelLockMap.putIfAbsent(className, newLock);
if (lock == null) {
lock = newLock;
}
}
return lock;
}
第一次null
检查仅针对上述向后兼容性。除此之外,这个使用频繁的代码与您的方法之间的唯一区别是,此代码避免了之后调用get
,因为putIfAbsent
已经返回旧对象(如果有的话)。
所以简单的答案,它的工作原理和这种模式也证明了Oracle JRE实现的一个非常关键的部分。