java动态同步是个好主意还是允许的?

时间:2015-01-26 17:24:48

标签: java concurrency synchronization locking

基本上,需要的是将请求同步到每个记录。 我能想到的一些代码是这样的:

//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
    }
}

1 个答案:

答案 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实现的一个非常关键的部分。