参考答案
1. 重入锁的使用
- 可重入锁最大作用是避免死锁。
- 当一个线程执行一个带锁的代码块或方法,同时代码块或方法里也获取同一个锁。为了避免死锁,此时就可以用可重入锁。
2. 重入锁的使用实例
public class SynchronizedSample implements Runnable {
public synchronized void funA() { // 执行funA方法,需要获取对象锁
// synchronized属于可重入锁,进入funA方法后,拥有了对象锁,所以执行方法funB方法时不受影响。
System.out.println(Thread.currentThread().getName() + " " + Thread.currentThread().getId());
funB();
}
public synchronized void funB() { // 执行funB方法,需要获取对象锁
System.out.println(Thread.currentThread().getName() + " " + Thread.currentThread().getId());
}
@Override
public void run() {
funA();
}
public static void main(String[] args) {
SynchronizedSample ss = new SynchronizedSample();
new Thread(ss).start();
new Thread(ss).start();
new Thread(ss).start();
}
}
public class ReentrantLockSample implements Runnable {
ReentrantLock lock = new ReentrantLock();
public void funA() { // 执行funA方法,需要获取对象锁
lock.lock(); // 第一次获取锁
System.out.println(Thread.currentThread().getName() + " " + Thread.currentThread().getId());
funB(); // 该方法会第二次获取锁
lock.unlock();
}
public void funB() { // 执行funB方法,需要获取对象锁
lock.lock();
System.out.println(Thread.currentThread().getName() + " " + Thread.currentThread().getId());
lock.unlock();
}
@Override
public void run() {
funA();
}
public static void main(String[] args) {
ReentrantLockSample rs = new ReentrantLockSample();
new Thread(rs).start();
new Thread(rs).start();
new Thread(rs).start();
}
}
结果:
Thread-1 14 Thread-1 14 Thread-2 15 Thread-2 15 Thread-0 13 Thread-0 13
以上,是Java面试题【重入锁怎么使用】的参考答案。
输出,是最好的学习方法。
欢迎在评论区留下你的问题、笔记或知识点补充~
—end—
