公平锁和非公平锁
是什么
公平锁:是指多线程按照申请锁的顺序来获取锁,先来后台
非公平锁:是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后来先到,在高并发情况下,有可能会造成优先级反转或者饥饿现象
两者区别
公平锁/非公平锁:并发包中ReentrantLock的创建可以指定构造函数的boolean类型来得到公平锁或非公平锁,默认是非公平锁
两者区别:
公平锁:锁被占用,加入等待队列,按照FIFO的规则从队列中取到自己
非公平锁:锁被占用,直接无视,尝试占有锁,如果尝试失败,就再采用类似公平锁那种方式。
其它
Java ReentrantLock
通过构造函数指定该锁是否是公平锁,默认是非公平锁,非公平锁的优点在于吞吐量比公平锁大。对于Synchronized而言,也是一种非公平锁。
可重入锁(递归锁)
可重入锁(也叫递归锁)
指的是同一线程外层函数获得锁之后,内层递归函数仍然能获取该锁的代码,
当同一个线程在外层方法获取锁时,在进入内层方法会自动获取锁。
也就是说,线程可以进入任何一个它已经拥有的锁所同步着的代码块。
特点:
ReentrantLock和Synchronized就是典型的可重入锁
可重入锁最大的作用是避免死锁
案例
自旋锁
案例:
1 | /** |
独占锁(写)/共享锁(读)
略
读写锁
1 | /** |