公平锁/非公平锁

多个线程抢锁的情况下,公平锁,跟遵循先来后到的规则,先进先出。
非公平锁,非公平锁比较粗鲁,上来就直接尝试占有锁,如果尝试失败,就再采用类似公平锁那种方式。

可重入锁/递归锁

synchronized 是 Java 的非公平锁,谁先抢到谁先得。

重入锁实现可重入性原理或机制是,每一个锁关联一个线程持有者和计数器,当计数器为 0 时表示该锁没有被任何线程持有,那么任何线程都可能获得该锁而调用相应的方法;当某一线程请求成功后,JVM会记下锁的持有线程,并且将计数器置为 1;此时其它线程请求该锁,则必须等待;而该持有锁的线程如果再次请求这个锁,就可以再次拿到这个锁,同时计数器会递增;当线程退出同步代码块时,计数器会递减,如果计数器为 0,则释放该锁。

参考资料

公平锁和非公平锁
JUC并发进阶之 Reentrantlock 可重入锁