Cách đây một thời gian, tôi đã viết blog về một cách hàm Java 8 để tính toán đệ quy số fibonacci , với ConcurrentHashMap
bộ nhớ cache và computeIfAbsent()
phương pháp mới, hữu ích :
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);
});
}
}
Tôi chọn ConcurrentHashMap
vì tôi đang nghĩ đến việc làm cho ví dụ này tinh vi hơn nữa bằng cách giới thiệu song song (cuối cùng thì tôi không làm như vậy).
Bây giờ, hãy tăng số lượng từ 8
lên 25
và quan sát điều gì sẽ xảy ra:
System.out.println(
"f(" + 25 + ") = " + fibonacci(25));
Chương trình không bao giờ tạm dừng. Bên trong phương thức, có một vòng lặp chạy mãi mãi:
for (Node<K,V>[] tab = table;;) {
// ...
}
Tôi đang sử dụng:
C:\Users\Lukas>java -version
java version "1.8.0_40-ea"
Java(TM) SE Runtime Environment (build 1.8.0_40-ea-b23)
Java HotSpot(TM) 64-Bit Server VM (build 25.40-b25, mixed mode)
Matthias, một độc giả của bài đăng trên blog đó cũng xác nhận vấn đề (anh ấy thực sự đã tìm thấy nó) .
Thật là kỳ lạ. Tôi đã mong đợi bất kỳ điều nào trong số hai điều sau:
- Nó hoạt động
- Nó ném một
ConcurrentModificationException
Nhưng chỉ cần không bao giờ dừng lại? Điều đó có vẻ nguy hiểm. Nó là một lỗi? Hay tôi đã hiểu nhầm hợp đồng nào đó?