相关疑难解决方法(0)

递归ConcurrentHashMap.computeIfAbsent()调用永远不会终止.错误或"功能"?

前段时间,我发表了一篇关于递归计算斐波纳契数的Java 8函数式方法的博文,其中包含一个ConcurrentHashMap缓存和新的有用computeIfAbsent()方法:

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class Test {
    static Map<Integer, Integer> cache = new ConcurrentHashMap<>();

    public static void main(String[] args) {
        System.out.println(
            "f(" + 8 + ") = " + fibonacci(8));
    }

    static int fibonacci(int i) {
        if (i == 0)
            return i;

        if (i == 1)
            return 1;

        return cache.computeIfAbsent(i, (key) -> {
            System.out.println(
                "Slow calculation of " + key);

            return fibonacci(i - 2) + fibonacci(i - 1);
        });
    }
} …
Run Code Online (Sandbox Code Playgroud)

java recursion concurrenthashmap java-8

71
推荐指数
2
解决办法
6258
查看次数

Java中的时区

我允许用户在我的网络应用程序上根据他们选择的时区安排活动.

我想向最终用户提供一个很好的时区列表,然后将其轻松转换java.util.TimeZone为服务器端的对象.

String[] TimeZone.getAvailableIds() 是我可以使用的东西,但问题是它打印了大约585个时区ID.

向用户提供一个简短的时区列表(如Windows框用于时区设置)并使用其ID轻松转换为服务器端的TimeZone对象的最佳方法是什么?

java timezone

26
推荐指数
3
解决办法
5万
查看次数

为并发删除的名称维护唯一对象

我正在使用以下编程习惯用法.我保持一个同步的HashMap与名称对象的关联.要查找对象的名称,我使用以下代码:

MyObject getObject(String name) {
   synchronized(map) {
      MyObject obj = map.get(name);
      if (obj == null) {
         obj = new MyObjec();
         map.put(name, obj);
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

当我想要专门处理这样的对象时,我会在这样的对象上使用synchronized:

synchronized(obj) {
    /* do something exclusively on obj (work type I) */
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,这一直一直运作良好.新要求是有I型和II型独家作品.类型I将保留对象,类型II应在完成工作后删除对象.如果我按照以下方式做某事:

synchronized(obj) {
    /* do something exclusively on obj (work type II) */
}
synchronized(map) { /* not good! */
   map.remove(obj);
}
Run Code Online (Sandbox Code Playgroud)

虽然该对象已从地图中删除,但我可能会将某些对象授予某些类型的工作.所以基本上,类型I工作的synchronized(obj)应该被一些新的信号量所取代,如果之前授予了类型II的工作,它就会将对象重新加入到地图中.对象应该只在没有未处理的同步时离开地图.

如果没有看到物体,那将是最好的.我会使用只有名称的API.这些对象仅用于维护名称的某些状态.但是,在完成第二类工作后,HashMap应该从名称中解放出来.但是在I型或II型工作期间,不应该锁定HashMap.

任何想法如何做到这一点?这是一个已知的模式吗?

再见

java concurrency hashmap

2
推荐指数
1
解决办法
389
查看次数

未初始化时在java map中初始化一个值

我有一张地图,通过调用increaseValue方法我需要增加它的价值。在该方法中,我检查值是否存在,如果不存在,则对其进行初始化并增加它。

private final Map<String, AtomicInteger> map = new ConcurrentHashMap<>();
 
public void increaseValue(String key) {
    map.putIfAbsent(key, new AtomicInteger(0));
    map.get(key).incrementAndGet();
}
Run Code Online (Sandbox Code Playgroud)

据我记得在java 11中这两个操作可以在一行中完成,不是吗?

java concurrenthashmap java-11

1
推荐指数
1
解决办法
115
查看次数