• CAS操作


    CAS操作:

    Compare and Swap,比较并操作,CPU指令,在大多数处理器架构,包括IA32、Space中采用的都是CAS指令,CAS的语义是“我认为V的值应该为A,如果是,那么将V的值更新为B,否则不修改并告诉V的值实际为多少”,CAS是项乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试。CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。

    悲观锁和乐观锁

    独占锁是一种悲观锁,synchronized就是一种独占锁,它假设最坏的情况,并且只有在确保其它线程不会造成干扰的情况下执行,会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。而另一个更加有效的锁就是乐观锁。所谓乐观锁就是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。

    简单来讲就是,当我所认为的A与实际上内存的V相同的时候,就把新的值B给V,否则就失败重来。

    这里粘贴一个,模拟CAS实现的计数器:

    public class CASCount implements Runnable {
        
        private SimilatedCAS counter = new SimilatedCAS();  
    
        @Override
        public void run() {
             for (int i = 0; i < 10000; i++) {  
                    System.out.println(this.increment());  
             }  
        }
        
        public int increment() {
            int oldValue = counter.getValue();
            int newValue = oldValue + 1;
            
            while (!counter.compareAndSwap(oldValue, newValue)) { //如果CAS失败,就去拿新值继续执行CAS
                  oldValue = counter.getValue();  
                  newValue = oldValue + 1;  
            }
            
            return newValue;
        }
        
        public static void main(String[] args) {  
            Runnable run = new CASCount();  
      
            new Thread(run).start();  
            new Thread(run).start();  
            new Thread(run).start();  
            new Thread(run).start();  
            new Thread(run).start();  
            new Thread(run).start();  
            new Thread(run).start();  
            new Thread(run).start();  
            new Thread(run).start();  
            new Thread(run).start();  
        }  
    }
    class SimilatedCAS {
        private int value;
        
        public int getValue() {
            return value;
        }
        
        // 这里只能用synchronized了,毕竟无法调用操作系统的CAS  
        public synchronized boolean compareAndSwap(int expectedValue, int newValue) {  
            if (value == expectedValue) {  
                value = newValue;  
                return true;  
            }  
            return false;  
        }  
    }
  • 相关阅读:
    TQ2440之DMA+IIS
    ST公司三轴加速度计LIS3DH应用
    TQ2440之PMW
    WinForm操作SQL Server数据库笔记
    DataRelation Learning
    SQL中join,left join,right join
    C#使用异步方式调用同步方法
    .Net Framework中的委托与事件转载
    Android site link
    【java】jdk时间差问题
  • 原文地址:https://www.cnblogs.com/gdjdsjh/p/5076815.html
Copyright © 2020-2023  润新知