Lock的初步使用:
ReentrantLock:重入锁,在一个线程中,调用两次lock方法,第一次是通过阻塞等待获取锁,第二次增加重试次数后,直接获取锁。
ReentrantReadWriteLock:原理:有两个锁:读锁和写锁,特点:若线程1获取读锁,线程2仍可以获取读锁,其他3种情况都不可以。应用场景:读写锁性能高于排他锁,原因:大部分场景是读多于写。
Lock和synchronized 的对比
1 语法:Lock是类,synchronized 是关键字
2 使用:Lock锁的释放是主动的,synchronized 是jvm释放的,被动的
3 功能:Lock有公平锁和非公平锁;synchronized 只有非公平锁
AQS(AbstractQueuedSynchronizer的简写):提供锁实现先进先出的框架
独占锁:ReentrantLock
共享锁:ReentrantReadWriteLock
内部实现:是一个先进先出的双向链表结构
compareAndSetState(CAS):
使用乐观锁(先判断期待值是否和实际值相等,若相等则更新,若不等,则失败)
对象的tail节点在内存的位置:当前对象+tail实例变量的偏移量,然后通过内存地址实现对tail节点的操作