不好意思,昨天发布的这个客户端代码是错误的,是我以前的工程的代码(郁闷,eclipse里面几十个工程自己把自己都搞晕了),以前的那个版本有错误。
所有的客户端如果发现缓存中没有存在对象,就通过MutexManager获得Metux,然后在此Metux上同步。不过MutexManager要求每一个Model对应一个,如果是全局model对应一个,竞争会非常激烈。不知道banq老师还有什么好的办法,我也改进一下。
以下是:Mutex代码
public class Mutex {
private volatile AtomicInteger usingCount ;
private volatile Serializable key ;
public Mutex(Serializable key) {
this.key = key;
}
public void addCount() {
usingCount.incrementAndGet();
}
public int getCount() {
return usingCount.get();
}
public void decrementCount() {
usingCount.decrementAndGet();
}
public Object getKey() {
return key;
}
}
以下是MutexManager代码:
public class MutexManagerImpl implements MutexManager {
private final ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock(
true);
private final Lock write = reentrantReadWriteLock.writeLock();
private final Map<Serializable, Mutex> mutexs = new ConcurrentHashMap<Serializable, Mutex>();
@Override
public Mutex getMutex(Serializable key) {
Mutex mutex = mutexs.get(key);
if (mutex != null) {
mutex.addCount();
return mutex;
}
return createMutex(key);
}
@Override
public void release(Mutex mutex) {
mutex.decrementCount();
if (mutex.getCount() > 0) {
return;
}
mutexs.remove(mutex.getKey());
}
private Mutex createMutex(Serializable key) {
//此锁只有在MODEL不在缓存,并且在针对第一个获得特定Id的线程才会用。
write.lock();
try {
Mutex mutex = mutexs.get(key);
if (mutex == null) {
mutex = new Mutex(key);
mutexs.put(key, mutex);
}
mutex.addCount();
return mutex;
} finally {
write.lock();
}
}
}
[该贴被xmuzyu于2009-05-14 16:23修改过]
[该贴被xmuzyu于2009-05-14 16:33修改过]