工作生活

重入锁实现方式

2019-07-04  本文已影响0人  whynotybb

重入性

解决重入性的两个关键问题:

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,如果当前结点是头结点,则再去做能不能成功获取锁的判断。

上一篇 下一篇

猜你喜欢

热点阅读