非公平锁和公平锁在ReentrantLock中的实现
如果一个锁是公平的,那么这个锁的获取顺序就应该符合请求的绝对时间顺序,FIFO。
对于非公平锁,只要CAS设置同步状态成功,则表示当前线程获取了锁,而公平锁还需要判断当前节点是否有前驱节点,如果有,则表示有线程比当前线程更早请求获取锁,因此还需要等待前驱线程获取释放锁之后才能继续获取锁。
讲一下sync 可重入如何实现
每一个锁关联一个线程持有者和一个计数器 。当计数器为0时表示该锁没有被任何线程持有,那么任何线程 都可能获得该锁并调用相应的方法。当一个线程请求成功的时候,JVM会记录下持有锁的线程,并将计数器置为1。此时其他线程请求该锁,则必须等待。而从持有该所的线程如果再次请求这个锁,就可以再次拿到这个锁,同时计数器会加一。当线程退出一个sycn方法的时候,计数器就会递减,如果计数器为0时则释放锁。
ReentrantLock都是如何实现重入的
内部定义了一个同步器 sync,加锁的时候通过CAS算法,并将线程对象放到一个双向链表中,每次获取锁的时候,看下当前维护的那个线程ID是否与当前请求的线程ID是否一样,一样则重入
Sync与Lock的区别
- sync是关键字,Lock是一个接口
- sync会自动的释放锁,而Lock必须手动进行释放,并且必须在finally中进行释放
- sync 是不可中断的,Lock可以中断也可以不中断
- 通过Lock可以知道线程是否获取了锁,而sync不能
- sync可以锁住代码块和方法 ,Lock只能锁住代码块
- Lock可以使用读锁提高多线程的读的效率
- sync 是非公平锁,ReentrantLock实现Lock 可以控制是公平锁还是非公平锁