• 乐观锁和悲观锁


    乐观锁AtomicInteger

    public final int incrementAndGet() {    

        for (;;) {    

               //这里可以拿到value的最新值    

               int current = get();

               int next = current + 1;

               if (compareAndSet(current, next))

                 return next;    

                 }    

      }   

     AtomicInteger这个变量存放在Java的内存堆里,当我在一个线程里要给它作增1操作时,发生的事情是:
      1).首先从内存堆读取最新的变量,写到current变量中;
      2).线程做next=current+1操作
      3).写回主内存的AtomicInteger中时,有可能这个变量已经被其它变量修改,因此需要做compareAndSet,先比较后修改;
          compareAndSet(current,next)的逻辑是首先判断内存中的值是否是current,如果是则改为next,它返回true表示修改成功
     
     
     
          如果内存中的值不是current,那么表示这个变量已经被其它线程修改,此时不做修改操作,直接返回false
          getAndIncrement实现的所有操作包在for(;;)这个无限循环中,直到修改成功。
     

    这里实现的乐观锁机制的原理时,乐观的认为只有我一个线程进行修改,因此不需要加锁。如果有别人进行修改,那么我尝试多次修改达到增1的目的

     悲观锁的原理时,我修改时,怕我的修改和别人的修改发生冲突,那么我不管有没有别人修改,我都强制加锁以保证修改不冲突
    如果别人不修改,那么我加锁就是多余的了。

    compareAndSet,就是乐观锁机制里面所谓的CAS原语,比较赋值是一个不可分割的原子操作,因此是线程安全的

  • 相关阅读:
    Java并发基础10:原子性操作类的使用
    Java并发基础09. 多个线程间共享数据问题
    Java并发基础08. 造成HashMap非线程安全的原因
    Java并发基础07. ThreadLocal类以及应用技巧
    Java并发基础06. 线程范围内共享数据
    Java并发基础05. 传统线程同步通信技术
    Java并发基础04. 线程技术之死锁问题
    我是如何从通信转到Java软件开发工程师的?
    IOS 判断耳机插入/拔出
    海量数据处理
  • 原文地址:https://www.cnblogs.com/zhengtu2015/p/4871453.html
Copyright © 2020-2023  润新知