重入性
解决重入性的两个关键问题:
1,在线程获取锁的时候,如果已经获取锁的线程是当前线程的话则直接再次获取成功;
2,由于锁会被获取n次,那么只有锁在被释放同样的n次后,才算完全释放成功。

主要逻辑如下:
1,如果同步状态为0,表示当前没有线程持有锁,则获取成功,并且设置持有锁的线程为当前线程。
2,如果同步状态大于0,表示当前已经有线程持有锁,判断持有锁的线程是不是当前线程,如果不是,则无法获取锁,返回false,如果是,则可以再次获得锁,并设置同步状态,返回true。

逻辑:
c=当前同步状态-1;
1,如果c==0,则释放锁成功,返回true,
2,如果c不为0,说明还没有彻底释放,返回false。
另外值得一提的是synchronize也是支持可重入的。
公平锁与非公平锁


公平锁和非公平锁是ReentrantLock的两个内部类,都实现了另外一个内部类Sync,Sync实现了AQS。

公平锁与非公平锁的区别:公平锁在获取锁时满足FIFO。

这里有区别的地方在hasQueuedProcessors():该方法的意义是判断在同步队列中,当前结点是否有前驱结点。如果有,则直接返回false,如果当前结点是头结点,则再去做能不能成功获取锁的判断。

网友评论