公平锁/非公平锁
- 公平锁是指多个线程按照申请锁的顺序来获取锁,类似队列,先进先出
- 非公平锁是指在多线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取到锁,在高并发的情况下,有可能造成优先级反转或者饥饿现象
- ReentrantLock可以通过构造函数指定采用哪种方式,默认是非公平锁
- 非公平锁的优点是吞吐量比公平锁大
可重入锁(递归锁)
同一线程外层函数获得锁之后,内层递归函数仍然能获得该锁的代码,在同一线程的外层方法获取锁的时候,在进入内层方法会自动获取锁,也就是说,线程可以进入任何一个它已经拥有的锁所同步着的代码块。
synchronized
public class SynchronizedDemo {
public static void main(String[] args) {
Phone phone=new Phone();
new Thread(phone::sendEmail,"a").start();
}
}
class Phone{
public synchronized void sendMsg(){
System.out.println("send message");
}
public synchronized void sendEmail(){
System.out.println("send email");
sendMsg();
}
}
ReentrantLock
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class SynchronizedDemo {
public static void main(String[] args) {
Phone phone = new Phone();
new Thread(phone::sendMsg, "a").start();
}
}
class Phone {
private Lock lock = new ReentrantLock();
public void sendMsg() {
lock.lock();
try {
System.out.println("send message");
sendEmail()