0 0
1 0
2 0
3 0
4 0
5 1
6 1
7 1
8 1
9 1
10 2
11 2
12 2
13 2
14 3
15 3
16 3
17 3
18 3
19 4
20 4
21 4
22 4
23 5
24 5
25 5
26 5
27 5
28 6
29 6
30 6
31 6
32 6
33 7
34 7
35 7
36 7
37 8
38 8
39 8
40 8
41 8
42 9
43 9
44 9
45 9
46 10
47 10
48 10
49 10
50 10
51 11
52 11
53 11
54 11
Вывод в случае 55 корзин. Все равномерно.
package com.javarush.task.task26.task2609;
import java.util.Random;
/*
Распределение элементов по корзинам с собственным локом
*/
public class Solution {
private static final int NUMBER_LOCKS = 12;
private final Node[] buckets;
private final Object[] locks;
static class Node {
public Node next;
public Object key;
public Object value;
}
public Solution(int numberBuckets) {
buckets = new Node[numberBuckets];
locks = new Object[NUMBER_LOCKS];
for (int i = 0; i < NUMBER_LOCKS; i++) {
locks[i] = new Object();
}
}
private final int hash(Object key) {
return Math.abs(key.hashCode() % buckets.length);
}
public Object get(Object key) {
int hash = hash(key);
int count = (NUMBER_LOCKS * hash) / buckets.length;
Object o = locks[count];
synchronized (o) {
for (Node m = buckets[hash]; m != null; m = m.next) {
if (m.key.equals(key)) return m.value;
}
}
return null;
}
public void clear() {
Object ob;
for (int i = 0; i < buckets.length; i++) {
int count = (NUMBER_LOCKS * i) / buckets.length;
ob = locks[count];
synchronized (ob) {
buckets[i] = null;
}
}
}
public static void main(String[] args) {
Solution sol = new Solution(55);
sol.get(new Object());
sol.clear();
}
}