AQS底层原理分析

廉价感情. 提交于 2020-10-03 05:15:38

juc

1)synchronized实践中的问题:
    锁的获得、锁的释放,不够灵活--》Lock的出现

2)Lock是一个接口:
    意味着这是一个标准,有很多种实现。 重入锁,读写锁。

3)ReentrantLock: 
    重入的含义:获得锁时,再次去获得锁,只用记录次数就行,而不会阻塞。
        synchronized 和 ReentrantLock

    重入是为了解决死锁问题的。


4)
              AQS

              Sync
        
    公平锁               非公平锁        


5)ReentrantLock重入互斥锁

6)ReentrantReadWriteLock: 只是读的话,是不需要加锁的。 读多写少时可以提升性能。
    只有读的时候,不会阻塞。 而A线程在写,B线程想去读取的时候,就会阻塞。 原因是: 必须保证B获取到的值是A写入的值。

    写写、读写 就会互斥。 而 读读是不会互斥的。

7)ReentrantLock的实现:
    当一个线程竞争锁的时候,其它线程怎么办? 按照我们之前的理解,必然是阻塞。那么如何实现的?


    同步队列。    

8)AQS有2种功能:
    独占: 独占是互斥。

    共享: 共享就是读写锁。

9)AQS的基本实现:
    维护了一个双向链表。线程竞争失败时,被封装为Node(pre、next)节点加入,Node就是抢占锁失败的线程。
    

10)锁的基本要素:
    jvm层面的CAS,调用unsafe层面的东西

11)非公平锁: 允许插队
    公平锁: 必须按照顺序来,不允许插队。
    
12)AQS的核心原理:
        构造一个双向链表,把要没有争抢到锁的线程放到双向链表里面。然后再去考虑阻塞的事情。
        
        park: 就算阻塞的意思
        
        LockSupport.park()
        
        
        Thread.interrupted(); // 返回一中断标志,并且复位
    
        head一直指向空的节点,
    
    
    释放锁的原理: lock.unlock() -->将state设置为0,同时去唤醒下一个节点。
    
13)state,cas比较,如果是0,则设置为1,并且自己获得锁。 其它2个线程则争夺失败,并且被封装为Node节点放到双向链表中。Park了。
    
        
14)ReentrantLock特有的灵活的地方: 指定公平或非公平锁、分组唤醒线程、中断等待锁的线程。    
    ReentrantLock基于jdk,synchronized是基于jvm实现。
    
    
    
    
    
    
    




























标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!