• TASLock TTASLock


    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时都会产生缓存缺失,都会从主存中去重新加载,这会导致一阵的总线风暴。
  • 相关阅读:
    面试题6 重建二叉树
    面试题5 从尾到头打印链表
    面试题4 替换空格
    面试题3 二维数组中查找
    面试题2 单例
    C++ 强制类型转换
    C++ 11 新特性
    STL 函数对象
    STL 算法
    OpenSSH多路复用Multiplexing配置
  • 原文地址:https://www.cnblogs.com/WeRtogether/p/4487972.html
Copyright © 2020-2023  润新知