locks[hash & (NUMBER_LOCKS - 1)]
locks[i & (NUMBER_LOCKS - 1)]
Π² ΠΌΠ΅ΡΠΎΠ΄Π°Ρ
get ΠΈ clear ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ.
Π― ΡΠ°ΠΊ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ, ΡΠΌΡΡΠ» ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ ΠΏΠΎΡΡΡΠΎΠΈΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌ Π²Π΅Π΄ΡΠ°ΠΌ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΠΊΠ°ΠΊΠΈΠΌ-ΡΠΎ ΠΏΠΎΡΠΎΠΊΠΎΠΌ. ΠΡΠΈ ΡΡΠΎΠΌ ΠΌΡΡΠ΅ΠΊΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΡΠ±ΠΈΡΠ°ΡΡΡΡ ΠΈΠ· ΠΊΡΡΠΊΠΈ ΠΌΡΡΠ΅ΠΊΡΠΎΠ² ΡΠ°Π½Π΄ΠΎΠΌΠ½ΠΎ ΠΈ ΠΏΡΠΈ ΡΡΠΎΠΌ, Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ Ρ
Π΅ΡΠ° (Π² ΠΏΠ΅ΡΠ²ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅), Π³Π΅Π½Π΅ΡΠ°ΡΠΈΡ ΠΈΠ½Π΄Π΅ΠΊΡΠ° ΠΌΡΡΠ΅ΠΊΡΠ° Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π΄Π°Π²Π°ΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡ ΠΆΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π½Π° ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡ ΠΆΠ΅ Ρ
ΡΡ. 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 (locks[hash & (NUMBER_LOCKS - 1)]) {
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 - 1)]) {
buckets[i] = null;
}
}
}
public static void main(String[] args) {
}
}