1.1 公平锁、非公平锁
公平锁:非常公平,不能够插队,必须先来后到。
非公平锁: 非常不公平,可以插队(默认是非公平锁)
代码示例
// 公平锁
public ReentrantLock() {
sync = new NonfairSync();
}
// 非公平锁
public ReentrantLock(boolean fair) {
sync = fair ? new FairSync() : new NonfairSync();
}
1.2 可重入锁
1.2.1 可重入锁概念
同一线程外层函数获得锁之后,内层递归函数仍然能获取该锁的代码,在同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁。线程可以进入任何一个它已经拥有的锁,所同步着的代码块。ReentrantLock、Synchronized 就是一个典型的可重入锁,可重入锁最大的作用就是避免死锁。
1.2.2 可重入锁图解
注意: 拿到外面锁1后,里面的锁2, 锁3、可以自动获得。
1.2.3 代码示例
Synchronized版本
package cn.guardwhy.lock;
public class ReentrantLockDemo01 {
public static void main(String[] args) {
// 创建phone对象
Phone phone = new Phone();
new Thread(()->{
phone.sendMessage();
}, "curry").start();
new Thread(()->{
phone.sendMessage();
}, "kobe").start();
}
}
// 手机类
class Phone{
public synchronized void sendMessage(){
System.out.println(Thread.currentThread().getName() + "发短信...");
// 调用call方法
call();
}
public synchronized void call(){
System.out.println(Thread.currentThread().getName() + "打电话...");
}
}
ReentrantLock版本
package cn.guardwhy