package kp;
import java.util.HashMap;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;
public class MyConcurrentHashMap<K, V> extends HashMap<K, V> {
private static final long serialVersionUID = 1L;
private ReentrantReadWriteLock[] lock = new ReentrantReadWriteLock[16];
public MyConcurrentHashMap() {
super();
for (int i = 0; i < 16; i++) {
lock[i] = new ReentrantReadWriteLock();
}
}
@Override
public V get(Object key) {
ReentrantReadWriteLock lock = getLock(key);
WriteLock wl = lock.writeLock();
if (lock.isWriteLocked()) {
try {
wl.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
lock.readLock().lock();
V value = super.get(key);
lock.readLock().unlock();
return value;
}
@Override
public V put(K key, V value) {
ReentrantReadWriteLock lock = getLock(key);
while (lock.getReadLockCount() > 0) {
try {
lock.readLock().wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
lock.writeLock().lock();
V val = super.put(key, value);
lock.writeLock().unlock();
return val;
}
private ReentrantReadWriteLock getLock(Object key) {
int hash = hashCode(key);
return lock[hash / 100];
}
private int hashCode(Object key) {
return (key == null ? 0 : key.hashCode() % 1600);
}
}
import java.util.HashMap;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;
public class MyConcurrentHashMap<K, V> extends HashMap<K, V> {
private static final long serialVersionUID = 1L;
private ReentrantReadWriteLock[] lock = new ReentrantReadWriteLock[16];
public MyConcurrentHashMap() {
super();
for (int i = 0; i < 16; i++) {
lock[i] = new ReentrantReadWriteLock();
}
}
@Override
public V get(Object key) {
ReentrantReadWriteLock lock = getLock(key);
WriteLock wl = lock.writeLock();
if (lock.isWriteLocked()) {
try {
wl.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
lock.readLock().lock();
V value = super.get(key);
lock.readLock().unlock();
return value;
}
@Override
public V put(K key, V value) {
ReentrantReadWriteLock lock = getLock(key);
while (lock.getReadLockCount() > 0) {
try {
lock.readLock().wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
lock.writeLock().lock();
V val = super.put(key, value);
lock.writeLock().unlock();
return val;
}
private ReentrantReadWriteLock getLock(Object key) {
int hash = hashCode(key);
return lock[hash / 100];
}
private int hashCode(Object key) {
return (key == null ? 0 : key.hashCode() % 1600);
}
}
------------------------------------------------------------------------------------------------------------------
package kp;
public class MyConcurrentHashMapTestDrive {
public static void main(String[] args) {
MyConcurrentHashMap<Integer, String> myConcurrentHashMap = new MyConcurrentHashMap<Integer, String>();
WriteMap w1 = new WriteMap(myConcurrentHashMap);
WriteMap w2 = new WriteMap(myConcurrentHashMap);
ReadMap r1 = new ReadMap(myConcurrentHashMap);
w1.setName("First Thread");
w2.setName("Second Thread");
w1.start();
w2.start();
r1.start();
}
}
class WriteMap extends Thread {
MyConcurrentHashMap<Integer, String> cMap;
public WriteMap(MyConcurrentHashMap<Integer, String> cMap){
this.cMap = cMap;
}
public void run(){
int i=1;
while(true){
cMap.put(i, this.currentThread().getName());
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class ReadMap extends Thread {
MyConcurrentHashMap<Integer, String> cMap;
public ReadMap(MyConcurrentHashMap<Integer, String> cMap){
this.cMap = cMap;
}
public void run(){
int i=1;
while(true){
System.out.println(cMap.get(i));
}
}
}
No comments:
Post a Comment