zoukankan      html  css  js  c++  java
  • 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时都会产生缓存缺失,都会从主存中去重新加载,这会导致一阵的总线风暴。
  • 相关阅读:
    【Winform】Webservice调用服务器端EXE
    LeetCode: Word Ladder II
    LeetCode: Maximal Rectangle
    Algorithm: 拓扑排序
    Algorithm: 匈牙利算法
    LeetCode: Scramble String
    LeetCode: Integer to Roman
    LeetCode: Roman to Integer
    算法导论:基础知识。
    C++主函数main()讲解
  • 原文地址:https://www.cnblogs.com/WeRtogether/p/4487972.html
Copyright © 2011-2022 走看看