Java多线程(三)显式锁和AQS

·什么是原子操作?怎么实现原子操作?

  synchronized关键字是基于阻塞的锁机制,有几个问题:

    1 被阻塞的线程优先级很高怎么办

    2 拿到锁的线程一直不释放锁

    3 有大量线程竞争怎么办,会消耗CPU,会有死锁或者活锁出现

    4 力度太大,如计数器就不需要这么限制

 

  CAS的原理(compare and swap):

    指令级别保证这是一个原子操作

    三个运算符: 内存地址V,期望值A,一个新值B

    如果地址V上的值和期望的值A相等,那么就给地址V赋新值B

    如果一直不是期望的值,就在循环(自旋、死循环)里面不断进行CAS,一直到成功为止

    

  CAS会带来三个问题:

    ABA问题:A-->B-->A第一次取的时候是A值,第二次放的时候还是A值,以为没有变化实际上变化了(解决方法:                                添加版本号)

    如果CAS操作长期不成功,cpu不断循环,开销问题

    CAS只能保证单个变量的原子操作

     

 

·原子操作类的使用

Java多线程(三)显式锁和AQS

 

   AtomicInteger中包含方法:get()、getAndIncrement()、IncrementAndGet()等

   AtomicReference中compareandSet()并不会改变原始对象

  AtomicMarkableReference,boolean,只关心又没有人动过(ABA问题解决)

  AtomicStampedReference,记录动过几次(ABA问题解决)

 

 

·显式锁:

  synchronized关键字别名是内置锁,是由java语言特性本身提供的功能,但是所得获取和释放固化了,智能先获取,再释放,Lock接口灵活许多,synchronized在获取锁的过程中是不能够被中断的

  

 

上一篇:原子操作类的使用以及ABA问题的解决


下一篇:2020牛客暑期多校训练营(第二场)All with Pairs