首页 > 技术文章 > 微服务注册中心---读写锁优化

ZenoLiang 2020-09-16 11:54 原文

首先我们看一下服务注册中心表:

这个时候就会出现多线程并发修改共享数据的问题.

我们首先考虑的是加锁:

我们单纯的加锁:

  1. //服务注册
  2. public synchronized void register(){
  3. //将服务实例信息加入内存的Map数据结构中
  4. }
  5. //读取服务注册表
  6. public synchronized Map<String,String> getRegistry(){
  7. //返回服务注册表数据
  8. }

所有线程读写服务注册表数据,都成为串行化.(不合适)

加读写锁:

1.一旦有人在写服务注册表数据,我们加个写锁,此时别人不能写,也不能读

2.有人在读数据的时候,可以让所有人都读,但是不予许任何人写

由于我们所处的环境是服务注册中心,因此读写锁非常适合这种读多写少的场景.

使用读写锁来实现:

  1. //针对注册表数据准备的读写锁
  2. private ReentrantReadWriteLock lock=new ReentrantReadWriteLock();
  3. private ReentrantReadWriteLock.WriteLock writeLock=lock.writeLock();
  4. private ReentrantReadWriteLock.ReadLock readLock=lock.readLock();
  5. //服务注册
  6. public void register(){
  7. writeLock.lock();
  8. //将服务实例信息加入内存的Map数据结构中
  9. writeLock.unlock();
  10. }
  11. //读取服务注册表
  12. public Map<String,String> getRegistry(){
  13. readLock.lock();
  14. //返回服务注册表数据
  15. readLock.unlock();
  16. }

 

推荐阅读