GVKun编程网logo

WeakHashMap是否具有java.util.concurrent等效项?(weakhashmap详解)

12

在本文中,您将会了解到关于WeakHashMap是否具有java.util.concurrent等效项?的新资讯,同时我们还将为您解释weakhashmap详解的相关在本文中,我们将带你探索WeakH

在本文中,您将会了解到关于WeakHashMap是否具有java.util.concurrent等效项?的新资讯,同时我们还将为您解释weakhashmap详解的相关在本文中,我们将带你探索WeakHashMap是否具有java.util.concurrent等效项?的奥秘,分析weakhashmap详解的特点,并给出一些关于c 11 – 相当于java.util.ConcurrentHashMap的C 11、com.intellij.util.containers.ConcurrentWeakHashMap的实例源码、ConcurrentHashMap 与同步 HashMap - ConcurrentHashMap vs Synchronized HashMap、ConcurrentHashMap是否有可能“死锁”?的实用技巧。

本文目录一览:

WeakHashMap是否具有java.util.concurrent等效项?(weakhashmap详解)

WeakHashMap是否具有java.util.concurrent等效项?(weakhashmap详解)

是否可以使用Collections.synchronizedMap()并发时保持正确性来重写下面的代码?

Collections.synchronizedMap(new WeakHashMap<Class, Object>());

即从java.util.concurrent是否有可以代替的东西?请注意,仅替换为

new ConcurrentHashMap<Class, Object>(new WeakHashMap<Class, Object>()));

显然行不通

答案1

小编典典

Guava的CacheBuilder类使您可以轻松地做到这一点。

CacheBuilder.newBuilder().weakKeys().build()

请注意,在您使用实例的情况下,这会将键相等语义更改为,==而不是.equals()将其替换为无关紧要,Class但这是一个潜在的陷阱。

c 11 – 相当于java.util.ConcurrentHashMap的C 11

c 11 – 相当于java.util.ConcurrentHashMap的C 11

我发现自己不断编写Mutex代码,以便同步对std :: unordered_map和其他容器的读/写访问,以便我可以像使用 java.util.concurrent容器一样使用它们.我即将开始编写一个包装器来封装Mutex,但我宁愿使用经过良好测试的库,所以我不会填充线程.

有这样的图书馆吗?

解决方法

英特尔生产了一个名为 Threading Building Blocks的库,它有两个这样的东西:concurrent_hash_map和concurrent_unordered_map.他们的 characteristics略有不同,但其中一个可能会满足您的需求.

com.intellij.util.containers.ConcurrentWeakHashMap的实例源码

com.intellij.util.containers.ConcurrentWeakHashMap的实例源码

项目:tools-idea    文件:VariableAccessFromInnerClassFix.java   
@NotNull
private Collection<PsiVariable> getvariablesToFix() {
  Map<PsiVariable,Boolean> vars = myClass.getUserData(VARS[myFixType]);
  if (vars == null) myClass.putUserData(VARS[myFixType],vars = new ConcurrentWeakHashMap<PsiVariable,Boolean>(1));
  final Map<PsiVariable,Boolean> finalVars = vars;
  return new AbstractCollection<PsiVariable>() {
    @Override
    public boolean add(PsiVariable psiVariable) {
      return finalVars.put(psiVariable,Boolean.TRUE) == null;
    }

    @Override
    public Iterator<PsiVariable> iterator() {
      return finalVars.keySet().iterator();
    }

    @Override
    public int size() {
      return finalVars.size();
    }
  };
}
项目:tools-idea    文件:TreeViewUtil.java   
private static boolean shouldAbbreviateName(PsiPackage aPackage) {
  final Project project = aPackage.getProject();
  ConcurrentMap<PsiPackage,Boolean> map = project.getUserData(SHOULD_ABBREV_PACK_KEY);
  if (map == null) {
    final ConcurrentWeakHashMap<PsiPackage,Boolean> newMap = new ConcurrentWeakHashMap<PsiPackage,Boolean>();
    map = ((UserDataHolderEx)project).putUserDataifAbsent(SHOULD_ABBREV_PACK_KEY,newMap);
    if (map == newMap) {
      ((PsiManagerEx)PsiManager.getInstance(project)).registerRunnabletoRunOnChange(new Runnable() {
        @Override
        public void run() {
          newMap.clear();
        }
      });
    }
  }

  Boolean ret = map.get(aPackage);
  if (ret != null) return ret;
  ret = scanPackages(aPackage,1);
  map.put(aPackage,ret);
  return ret;
}
项目:tools-idea    文件:LoaderFactory.java   
public LoaderFactory(final Project project) {
  myProject = project;
  myModule2ClassLoader = new ConcurrentWeakHashMap<Module,ClassLoader>();
  myConnection = myProject.getMessageBus().connect();
  myConnection.subscribe(ProjectTopics.PROJECT_ROOTS,new ModuleRootAdapter() {
    public void rootsChanged(final ModuleRootEvent event) {
      clearClassLoaderCache();
    }
  });

  disposer.register(project,new disposable() {
    public void dispose() {
      myConnection.disconnect();
      myModule2ClassLoader.clear();
    }
  });
}
项目:consulo-ui-designer    文件:LoaderFactory.java   
public LoaderFactory(final Project project) {
  myProject = project;
  myModule2ClassLoader = new ConcurrentWeakHashMap<Module,new disposable() {
    public void dispose() {
      myConnection.disconnect();
      myModule2ClassLoader.clear();
    }
  });
}
项目:consulo    文件:TreeViewUtil.java   
private static boolean shouldAbbreviateName(PsiPackage aPackage) {
  final Project project = aPackage.getProject();
  ConcurrentMap<PsiPackage,ret);
  return ret;
}
项目:tools-idea    文件:CreateConstructorParameterFromFieldFix.java   
@NotNull
private Collection<SmartPsiElementPointer<PsiField>> getFieldsToFix() {
  Map<SmartPsiElementPointer<PsiField>,Boolean> fields = myClass.getUserData(FIELDS);
  if (fields == null) myClass.putUserData(FIELDS,fields = new ConcurrentWeakHashMap<SmartPsiElementPointer<PsiField>,Boolean>(1));
  final Map<SmartPsiElementPointer<PsiField>,Boolean> finalFields = fields;
  return new AbstractCollection<SmartPsiElementPointer<PsiField>>() {
    @Override
    public boolean add(SmartPsiElementPointer<PsiField> psiVariable) {
      PsiField field = psiVariable.getElement();
      if (field == null || !isAvailable(field)) return false;
      return finalFields.put(psiVariable,Boolean.TRUE) == null;
    }

    @Override
    public Iterator<SmartPsiElementPointer<PsiField>> iterator() {
      return finalFields.keySet().iterator();
    }

    @Override
    public int size() {
      return finalFields.size();
    }

    @Override
    public void clear() {
      finalFields.clear();
    }
  };
}
项目:tools-idea    文件:BindFieldsFromParametersAction.java   
@NotNull
private static Collection<SmartPsiElementPointer<PsiParameter>> getUnboundedParams(PsiMethod psiMethod) {
  Map<SmartPsiElementPointer<PsiParameter>,Boolean> params = psiMethod.getUserData(ParaMS);
  if (params == null) psiMethod.putUserData(ParaMS,params = new ConcurrentWeakHashMap<SmartPsiElementPointer<PsiParameter>,Boolean>(1));
  final Map<SmartPsiElementPointer<PsiParameter>,Boolean> finalParams = params;
  return new AbstractCollection<SmartPsiElementPointer<PsiParameter>>() {
    @Override
    public boolean add(SmartPsiElementPointer<PsiParameter> psiVariable) {
      return finalParams.put(psiVariable,Boolean.TRUE) == null;
    }

    @Override
    public Iterator<SmartPsiElementPointer<PsiParameter>> iterator() {
      return finalParams.keySet().iterator();
    }

    @Override
    public int size() {
      return finalParams.size();
    }

    @Override
    public void clear() {
      finalParams.clear();
    }
  };
}
项目:tools-idea    文件:MavenProjectsManagerWatcher.java   
private boolean xmlFileWasChanged(VirtualFile xmlFile,VFileEvent event) {
  if (!xmlFile.isValid() || !(event instanceof VFileContentChangeEvent)) return true;

  ConcurrentWeakHashMap<Project,Integer> map = xmlFile.getUserData(CRC_WITHOUT_SPACES);
  if (map == null) {
    map = xmlFile.putUserDataifAbsent(CRC_WITHOUT_SPACES,new ConcurrentWeakHashMap<Project,Integer>());
  }

  Integer crc = map.get(myProject);
  Integer newCrc;

  try {
    newCrc = MavenUtil.crcWithoutSpaces(xmlFile);
  }
  catch (IOException ignored) {
    return true;
  }

  if (newCrc == -1 // XML is invalid
      || newCrc.equals(crc)) {
    return false;
  }
  else {
    map.put(myProject,newCrc);
    return true;
  }
}
项目:idea-gitignore    文件:HandleTrackedIgnoredFilesAction.java   
/**
 * Helper method to return tracked and ignored files map.
 *
 * @param event current event
 * @return map of files
 */
private ConcurrentMap<VirtualFile,VcsRoot> getTrackedIgnoredFiles(@NotNull AnActionEvent event) {
    final Project project = event.getProject();

    if (project != null) {
        return IgnoreManager.getInstance(project).getConfirmedIgnoredFiles();
    }

    return new ConcurrentWeakHashMap<VirtualFile,VcsRoot>();
}
项目:consulo-java    文件:CreateConstructorParameterFromFieldFix.java   
@NotNull
private Collection<SmartPsiElementPointer<PsiField>> getFieldsToFix() {
  Map<SmartPsiElementPointer<PsiField>,Boolean.TRUE) == null;
    }

    @Override
    public Iterator<SmartPsiElementPointer<PsiField>> iterator() {
      return finalFields.keySet().iterator();
    }

    @Override
    public int size() {
      return finalFields.size();
    }

    @Override
    public void clear() {
      finalFields.clear();
    }
  };
}
项目:consulo-java    文件:BindFieldsFromParametersAction.java   
@NotNull
private static Collection<SmartPsiElementPointer<PsiParameter>> getUnboundedParams(PsiMethod psiMethod) {
  Map<SmartPsiElementPointer<PsiParameter>,Boolean.TRUE) == null;
    }

    @Override
    public Iterator<SmartPsiElementPointer<PsiParameter>> iterator() {
      return finalParams.keySet().iterator();
    }

    @Override
    public int size() {
      return finalParams.size();
    }

    @Override
    public void clear() {
      finalParams.clear();
    }
  };
}
项目:tools-idea    文件:ResolveCache.java   
private static <K,V> ConcurrentWeakHashMap<K,V> createWeakMap() {
  return new ConcurrentWeakHashMap<K,V>(100,0.75f,Runtime.getRuntime().availableProcessors(),ContainerUtil.<K>canonicalStrategy());
}
项目:consulo-haxe    文件:HaxeClassResolveCache.java   
private static <K,V>(7,TObjectHashingStrategy.CANONICAL);
}
项目:idea-gitignore    文件:CachedConcurrentMap.java   
/**
 * Default constructor.
 *
 * @param fetcher data fetcher
 */
private CachedConcurrentMap(@NotNull DataFetcher<K,V> fetcher) {
    this.map = new ConcurrentWeakHashMap<K,V>();
    this.fetcher = fetcher;
}

ConcurrentHashMap 与同步 HashMap - ConcurrentHashMap vs Synchronized HashMap

ConcurrentHashMap 与同步 HashMap - ConcurrentHashMap vs Synchronized HashMap

问题:

What is the difference between using the wrapper class, SynchronizedMap , on a HashMap and ConcurrentHashMap ?HashMapConcurrentHashMap 上使用包装类 SynchronizedMap 什么区别?

Is it just being able to modify the HashMap while iterating it ( ConcurrentHashMap )? 它是否只能在迭代时修改 HashMap ( ConcurrentHashMap )?


解决方案:

参考: https://stackoom.com/en/question/5Q44

ConcurrentHashMap是否有可能“死锁”?

ConcurrentHashMap是否有可能“死锁”?

我们遇到了一个奇怪的问题ConcurrentHashMap,其中似乎有两个线程正在调用put(),然后在方法内部永远等待Unsafe.park()。从外部看,内部看起来像是一个僵局ConcurrentHashMap

到目前为止,我们只看到这种情况发生一次。

谁能想到任何可能导致这些症状的东西?

编辑 :相关线程的线程转储在这里:

“ [已编辑]线程2” prio = 10 tid = 0x000000005bbbc800 nid = 0x921等待条件[0x0000000040e93000]   java.lang.Thread.State:等待(停车)    在sun.misc.Unsafe.park(本机方法)    -停车以等待<0x00002aaaf1207b40>(java.util.concurrent.locks.ReentrantLock $ NonfairSync)    在java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)    在java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:747)    在java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:778)    在java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1114)    在java.util.concurrent.locks.ReentrantLock $ NonfairSync.lock(ReentrantLock.java:186)    在java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:262)    在java.util.concurrent.ConcurrentHashMap $ Segment.put(ConcurrentHashMap.java:417)    在java.util.concurrent.ConcurrentHashMap.put(ConcurrentHashMap.java:883)    于[删除]“ [已编辑]线程0” prio = 10 tid = 0x000000005bf38000 nid = 0x91f等待条件[0x000000004151d000]   java.lang.Thread.State:等待(停车)    在sun.misc.Unsafe.park(本机方法)    -停车以等待<0x00002aaaf1207b40>(java.util.concurrent.locks.ReentrantLock $ NonfairSync)    在java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)    在java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:747)    在java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:778)    在java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1114)    在java.util.concurrent.locks.ReentrantLock $ NonfairSync.lock(ReentrantLock.java:186)    在java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:262)    在java.util.concurrent.ConcurrentHashMap $ Segment.put(ConcurrentHashMap.java:417)    在java.util.concurrent.ConcurrentHashMap.put(ConcurrentHashMap.java:883)    于[删除]

答案1

小编典典

可能不是您想要的答案,但这可能是JVM错误。看到

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6865591

关于WeakHashMap是否具有java.util.concurrent等效项?weakhashmap详解的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于c 11 – 相当于java.util.ConcurrentHashMap的C 11、com.intellij.util.containers.ConcurrentWeakHashMap的实例源码、ConcurrentHashMap 与同步 HashMap - ConcurrentHashMap vs Synchronized HashMap、ConcurrentHashMap是否有可能“死锁”?的相关信息,请在本站寻找。

本文标签: