公平与非公平
- 公平锁:在获取锁时存在一个队列,后到的线程会自动排在后面,等待前面的线程执行结束后执行。体现一个先来后到的公平性。
- 非公平锁:实现原理和公平锁存在一些区别,在获取锁时会先尝试获取抢占锁,不去排队,抢占成功则直接向下执行,抢占失败也会加入到队列的后面,等待排队。
- new ReentrantLock();默认是非公平锁。会稍稍提升一点性能。因为减少的入队列和出队的损耗。true为公平锁。
lock、unlock、tryLock
- lock: ReentrantLock 可以设置超时时间,是可重入锁,阻塞式锁,获取失败会一直阻塞等待,既获取到锁的线程可以重复使用lock上锁,内部会记录当前线程lock的次数。
- unlock: 释放锁,将线程的获取的锁次数-1,一个线程lock多少次,就需要unlock多少次,才能真真的释放锁。
- tryLock: 与lock的功能类型一样,都是获取锁,不同点是tryLock会返回是否成功获取到锁,tryLock 不阻塞线程,获取失败就返回false,在代码实现上,可以使用该方法进行一些不获取到锁也可以向下执行的其他操作。或者通过while循环跳过锁进行遍历。
实现原理
底层实现是基于CAS和AQS,不同于synchronized的锁 实现是通过保存在对象头中的,而ReentrantLock是通过自身的API,以及int的state等复杂逻辑判断锁的状态 。