/*
* before entering into synchronized method or block thread needs to acquire the lock
* Here different thread cannot access "put" / "get" from the same instance of hashmap at the same time
* The lock is obtained at the object level, meaning if t1 is using put(), t2 cannot use get() simultaneously
*/publicThreadSafeHashMap() {
items = (LinkedList<Cell<K, V>>[]) new LinkedList[cap];
}
publicinthashCode(K key) {
return key.toString().length() % items.length;
}
publicsynchronizedvoidput(K key, V value) {
int x = hashCode(key);
if (items[x] == null) {
items[x] = new LinkedList<Cell<K, V>>();
}
LinkedList<Cell<K, V>> list = items[x];
for (Cell<K, V> c : list) {
if (c.equals(key)) {
list.remove(c);
break;
}
}
Cell<K, V> cell = new Cell<K, V>(key, value);
list.add(cell);
}
publicsynchronized V get(K key) {
int x = hashCode(key);
if (items[x] == null) {
returnnull;
}
LinkedList<Cell<K, V>> list = items[x];
for (Cell<K, V> c : list) {
if (c.equals(key)) {
return c.getValue();
}
}
returnnull;
}
}