有没有更聪明的办法?
.... synchronized (myMap) { if (myMap.size() < 5) { myMap.putIfAbsent("something", true); } } ...
1tuwyuhd1#
不仅没有一种聪明的方法来实现这一点,而且您所展示的方法也不会起作用。synchronized不锁定ConcurrentHashMap,后者使用完全不同的机制来实现其内部并发性;size调用和put之间仍然存在竞争。您可以考虑使用Caffeine这样的缓存库,它可以满足您的需要。
synchronized
size
put
dffbzjpn2#
一种方法是使用内置的computeIfAbsent(Key,Function)函数并检查是否存在特定的键,使用computeIfAbsent()的Function部分计算键的值,您可以添加条件来检查ConcurrentHashMap的大小。
int initialCapacity = 1; ConcurrentHashMap<String,String> a=new ConcurrentHashMap<>(); a.computeIfAbsent("b",x->{return a.size()<=initialCapacity?"800":null;}); System.out.println(a);
供参考-https:www.geeksforgeeks.org/concurrenthashmap-computeifabsent-method-in-java-with-examples/
2条答案
按热度按时间1tuwyuhd1#
不仅没有一种聪明的方法来实现这一点,而且您所展示的方法也不会起作用。
synchronized
不锁定ConcurrentHashMap,后者使用完全不同的机制来实现其内部并发性;size
调用和put
之间仍然存在竞争。您可以考虑使用Caffeine这样的缓存库,它可以满足您的需要。
dffbzjpn2#
一种方法是使用内置的computeIfAbsent(Key,Function)函数并检查是否存在特定的键,使用computeIfAbsent()的Function部分计算键的值,您可以添加条件来检查ConcurrentHashMap的大小。
供参考-https:www.geeksforgeeks.org/concurrenthashmap-computeifabsent-method-in-java-with-examples/