什么是锁?
简单来讲在Java中,锁是一种用于并发控制的机制,用于保护共享资源,防止多个线程同时访问或修改数据导致的数据不一致性和线程安全问题。在Java虚拟机(JVM)中,每个对象都有一个相关联的锁监视器,也称为内置锁或监视器锁。每个对象的锁监视器用于实现对象级别的互斥访问,确保同一时间只有一个线程可以获取该对象的锁并执行同步代码块。(由于每个JVM的锁监视器都是独立存在的,所以就会引出我们的分布式锁的需求)
可重入锁和不可重入锁
在Java中,可重入锁是指同一个线程可以多次获取同一个锁而不会产生死锁或其他异常情况。换句话说,可重入锁允许线程在持有锁的情况下再次获取该锁,而不会被自己所持有的锁所阻塞。不可重入锁是指一旦线程获取了锁,再次尝试获取同一个锁时会被阻塞。
下面是一段不可重入锁的代码:
public class DeadlockExample {
private static final Object lockA = new Object();
private static final Object lockB = new Object();
public static void main(String[] args) {
Thread thread1 = new Thread(() -> {
synchronized (lockA) {
System.out.println("Thread 1 acquired lockA");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lockB) {
System.out.println("Thread 1 acquired lockB");
}
}
});
Thread thread2 = new Thread(() -> {
synchronized (lockB) {
System.out.println("Thread 2 acquired lockB");
synchronized (lockA) {
System.out.println("Thread 2 acquired lockA");
}
}
});
thread1.start();
thread2.start();
}
}
如此线程A和线程B会因为相互等待而发生死锁。