重入锁怎么使用

参考答案

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—

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧