一,公平锁和非公平锁
公平锁:指多个线程按照申请锁的顺序来获取锁,先来后到
非公平锁:多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁,在高并发的情况下,有可能会造成优先级反转活着饥饿现象
java ReentrantLock而言,默认是公平锁。传true是公平锁,非公平锁的优点在于吞吐量比公平锁要大
syncronized是一种非公平锁
二,可重入锁:又名递归锁
同一线程外层函数获得锁之后,内层递归函数仍然能获取该锁的代码,在同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁
也即:**线程可以进入任何一个它已经拥有的锁所同步着的代码块
**ReentrantLock/Syncronized就是一个典型的可重入锁。最大的作用就是避免死锁。
package learn;
/**
* @author:tao.liu
* @Date:2020/1/1
*/
public class Test{
public static void main(String[] args) {
Runnable myrun = new Myrun();
Thread thread = new Thread(myrun);
thread.start();
Runnable myrun1 = new Myrun();
Thread thread1 = new Thread(myrun1);
thread1.start();
}
}
class Myrun implements Runnable{
public void run() {
Test1 test1 = new Test1();
test1.a();
}
}
class Test1{
public synchronized void a(){
System.out.println(Thread.currentThread().getId()+"\t a方法在使用");
b();
}
private synchronized void b() {
System.out.println(Thread.currentThread().getId()+"\t b方法在使用");
}
}
结果是:
12 a方法在使用
12 b方法在使用
13 a方法在使用
13 b方法在使用
12线程在获取到a方法的外层锁的情况下,自动获取b方法的锁