首先我们看一下服务注册中心表:
这个时候就会出现多线程并发修改共享数据的问题.
我们首先考虑的是加锁:
我们单纯的加锁:
-
//服务注册
-
public synchronized void register(){
-
//将服务实例信息加入内存的Map数据结构中
-
}
-
//读取服务注册表
-
public synchronized Map<String,String> getRegistry(){
-
//返回服务注册表数据
-
}
所有线程读写服务注册表数据,都成为串行化.(不合适)
加读写锁:
1.一旦有人在写服务注册表数据,我们加个写锁,此时别人不能写,也不能读
2.有人在读数据的时候,可以让所有人都读,但是不予许任何人写
由于我们所处的环境是服务注册中心,因此读写锁非常适合这种读多写少的场景.
使用读写锁来实现:
-
//针对注册表数据准备的读写锁
-
private ReentrantReadWriteLock lock=new ReentrantReadWriteLock();
-
private ReentrantReadWriteLock.WriteLock writeLock=lock.writeLock();
-
private ReentrantReadWriteLock.ReadLock readLock=lock.readLock();
-
//服务注册
-
public void register(){
-
writeLock.lock();
-
//将服务实例信息加入内存的Map数据结构中
-
writeLock.unlock();
-
}
-
//读取服务注册表
-
public Map<String,String> getRegistry(){
-
readLock.lock();
-
//返回服务注册表数据
-
readLock.unlock();
-
}