skiplist 分段锁

level skiplist

leveldb skiplist 通过采用write lock和memory barrier的方式, 保证读读, 读写操作不会冲突, 但是写写是相互阻塞的, 如果对Insert操作分析一下, 不难发现, 当同时Insert不相邻的enrty时,Insert操作之间是相互不影响的, 那么除了write mutex lock, 是否可以采用更好的方式提高写写的并发呢?

优化

skiplist 的高度为1时,退化为有序的list, 先看一下怎么去提高有序list insert的并发。

  • 找到node entry要insert的位置时, 记录下<entry的node pre, * 同时记录下>= entry的node pre的next node即node next
  • entry.next = next,CAS(pre.next, next, entry), 如果失败, 从node pre向后找, 找到新的pre, next, 继续该操作, 知道成功为止。
  • entry成功插入list

对于skiplist的高度>1时, skiplist不同高度的list相互间是互不影响的, 因此, 该优化对于skiplist是同样适应的。

如果不采用CAS, 使用mutex lock又该如何呢?

  • 找到node entry要insert的位置时, 记录下<entry的node pre, * 同时记录下>= entry的node pre的next node即node next
  • 获得锁, check pre.next是否是next, 如果不是, 释放锁, 从pre向后找到新的pre, next,继续该操作, 直到成功,然后entry.next=next, pre.next=entry, 释放锁
  • entry成功插入list

总结

对于write write的数据之间相互不影响时, 往往可以采用分段锁来提高并发,比如ConcurrentHashMap