整理下java相关锁的概念,加强理解
图片来自:https://www.cnblogs.com/jyroy/p/11365935.html
公平锁/非公平锁
公平锁是指多个线程按照申请锁的顺序(有队列)来获取锁。 非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁。有可能,会造成优先级反转或者饥饿现象。 对于Java ReentrantLock而言,通过构造函数指定该锁是否是公平锁,默认是非公平锁。非公平锁的优点在于吞吐量比公平锁大。 对于Synchronized而言,也是一种非公平锁。由于其并不像ReentrantLock是通过AQS的来实现线程调度,所以并没有任何办法使其变成公平锁。
可重入锁
可重入锁又名递归锁,是指在同一个线程获得一个对象进入一个方法获取锁的时候,在进入该对象另一个同步方法方法会自动获取锁。说的有点抽象,下面会有一个代码的示例。 对于Java ReentrantLock而言, 他的名字就可以看出是一个可重入锁,其名字是Re entrant Lock重新进入锁。 对于Synchronized而言,也是一个可重入锁。可重入锁的一个好处是可一定程度避免死锁。
class Test{
synchronized void A() throws Exception{
Thread.sleep(1000);
B();
}
synchronized void B() throws Exception{
Thread.sleep(1000);
}
}
上面的代码就是一