/*
* 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
*/
public ThreadSafeHashMap() {
items = (LinkedList<Cell<K, V>>[]) new LinkedList[cap];
}
public int hashCode(K key) {
return key.toString().length() % items.length;
}
public synchronized void put(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);
}
public synchronized V get(K key) {
int x = hashCode(key);
if (items[x] == null) {
return null;
}
LinkedList<Cell<K, V>> list = items[x];
for (Cell<K, V> c : list) {
if (c.equals(key)) {
return c.getValue();
}
}
return null;
}
}
[LinkedIn] Implement a thread safe hashtable
最新推荐文章于 2015-04-07 14:41:56 发布