http://my.oschina.net/clopopo/blog/140479

 

public class TASLock { 
   private AtomicBoolean state = new AtomicBoolean(false);
   publicvoidlock() { 
      while (state.getAndSet(true)) {} 
   }
   public void unlock() {
       state.set(false);
   } 
}
 
public class TTASLock {
    private AtomicBoolean state = new AtomicBoolean(false);
     // 加锁
    public void lock() {
        while (true) {
            while (state.get()) {
                // 自旋
            }
            if (!state.getAndSet(true)) {
                break;
            }
        }
    }
    public void unlock() {
        state.set(false);
    }
}
 
AtomicBoolean是布尔值的一个原子类型实现类。原子类型的方法是线程安全的。
 
TASLock :自旋测试(getandset)每次都会去设置state值,导致其他线程的本地缓存无效。每次都会产生缓存缺失。大量的缓存缺失又会导致总线资源被严重的占用(每次都得从主存中加载值)。
 
当然TTASLock也不是完美的加锁方案。因为TTASLock在解锁的时候,会导致其他线程本地缓存中state值无效。所有的线程再次执行get时都会产生缓存缺失,都会从主存中去重新加载,这会导致一阵的总线风暴。
posted on 2015-05-08 16:07  weRtogether  阅读(504)  评论(0编辑  收藏  举报