-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathSolution.java
More file actions
113 lines (94 loc) · 3.62 KB
/
Solution.java
File metadata and controls
113 lines (94 loc) · 3.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
//Let no man deceive himself. If any man among you seems to be wise in this world, let him become a fool, that he may be wise. (1Cor 3:18)
package com.javarush.task.task26.task2609;
/*
Распределение элементов по корзинам с собственным локом
*/
public class Solution {
private static final int NUMBER_LOCKS = 12;
private final Node[] buckets;
private final Object[] locks;
private 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);
synchronized (locks[hash % NUMBER_LOCKS]) {
for (Node m = buckets[hash]; m != null; m = m.next) {
if (m.key.equals(key)) return m.value;
}
}
return null;
}
public void clear() {
for (int i = 0; i < buckets.length; i++) {
synchronized (locks[i % NUMBER_LOCKS]) {
buckets[i] = null;
}
}
}
}
/*
Распределение элементов по корзинам с собственным локом
В синхронизированных блоках используй нужный лок.
Требования:
1. Класс Solution должен содержать private static final поле int NUMBER_LOCKS.
2. Класс Solution должен содержать private final поле Node[] buckets.
3. Класс Solution должен содержать private final поле Object[] locks.
4. Все методы класса Solution не должны быть synchronized.
5. В методе get() класса Solution в synchronized блоке используй lock из массива locks в зависимости от хэша объекта и количества лок объектов.
6. В методе clear() класса Solution в synchronized блоке используй lock из массива locks в зависимости от индекса элемента и количества лок объектов.
package com.javarush.task.task26.task2609;
*
Распределение элементов по корзинам с собственным локом
*
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);
synchronized (this) {
for (Node m = buckets[hash]; m != null; m = m.next) {
if (m.key.equals(key)) return m.value;
}
}
return null;
}
public void clear() {
for (int i = 0; i < buckets.length; i++) {
synchronized (this) {
buckets[i] = null;
}
}
}
public static void main(String[] args) {
}
}
*/