几种锁算法的实现

2018-07-20    来源:open-open

容器云强势上线!快速搭建集群,上万Linux镜像随意使用

Abstract

4种Lock的实现:

  • TASLock
  • TTASLock
  • CLHLock
  • MCSLock

TASLock

每一个Lock带有一个状态位,lock()与unlock()操作原子的改变状态位。false时可进入,true时spin。

public class TASLock implements Lock
{
  AtomicBoolean state = new AtomicBoolean(false);
  public void lock()
  {
    while(state.getAndSet(true))
    {}
  }
  public void unlock()
  {
    state.set(false);
  }
}

defect:

  • 在锁被其他线程持有的情况下, while(state.getAndSet(true)) 会不停的将

    state从true改为true

TTASLock

TASLock算法的改进。

public class TTASLock implements Lock()
{
  AtomicBoolean state = new AtomicBoolean(false);
  public void lock()
  {
    while (true)
    {
      while (state.get())
      {};
      if (! state.getAndSet(true))
        return;
    }
  }
  public void unlock()
  {
    state.set(false);
  }
}

  1. while (state.get()){} 是一个改进,效果是先看一眼lock的状态,当lock是false时,
    再真正的执行 state.getAndSet(true)
  2. 当state.getAndSet(true) 的return为false时,说明之前的确是false,于是获得锁,return。
    否则回到while(true),再次尝试获得锁。

defect:

  • 在unlock时,state.set(false)还是会带来大量的cache miss。
  • cache miss VS cache hit

CLHLock

队列锁。

CLHLock

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点!
本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。

上一篇:php加密解密处理类

下一篇:Python异步任务队列