参考答案
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—