jucjvm
1)synchronized实践中的问题:
锁的得到、锁的释放,不够灵活--》Lock的出现
性能
2)Lock是一个接口:
意味着这是一个标准,有不少种实现。 重入锁,读写锁。
线程
3)ReentrantLock:
重入的含义:得到锁时,再次去得到锁,只用记录次数就行,而不会阻塞。
synchronized 和 ReentrantLock
接口
重入是为了解决死锁问题的。队列
4)
AQS
同步
Sync
公平锁 非公平锁
it
5)ReentrantLock重入互斥锁
class
6)ReentrantReadWriteLock: 只是读的话,是不须要加锁的。 读多写少时能够提高性能。
只有读的时候,不会阻塞。 而A线程在写,B线程想去读取的时候,就会阻塞。 缘由是: 必须保证B获取到的值是A写入的值。
原理
写写、读写 就会互斥。 而 读读是不会互斥的。jdk
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实现。