java - 如果 Java 线程已经被该线程占用,为什么还必须重新进入该锁?

标签 java multithreading locks reentrantlock

我正在阅读有关 Java 线程和可重入锁的内容。 ReentrantLock 允许线程多次锁定某个资源。我的问题是,如果线程已经锁定了资源,为什么它必须这样做?这次“重入”的目的是什么?

最佳答案

假设一个类中有两个状态变量:

@GuardedBy("this")
List<String> countryList = new ArrayList<>();

@GuardedBy("this")
Map<String,String> countryCapitalMap  = new ArrayList<>();

假设某个线程 A 正在访问 countryList。这意味着它已经获得了“this”的锁。现在,由于 Java 中的锁是可重入的,这意味着线程也能够获取 countryCapitalMap 上的锁。如果获取锁是每次调用(而不是每个线程),那么一旦线程 A 获取了“this”上的锁,我就必须在它再次获取它之前释放它(以访问 countryCapitalMap).

编辑:这是一些代码:

private synchronized insertCapital(String country, String city) {
    this.countryCapitalMap.put(country, city);
}

private synchronized getRandomCountry() {
   int randomInt = ...//randomly generated number
   return this.countryList.get(randomInt);
}

可重入锁将使您的线程只需获取一次锁即可访问这两种方法。

关于java - 如果 Java 线程已经被该线程占用,为什么还必须重新进入该锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57941719/

相关文章:

java - 如何使用注解实现动态 linting 检查?

android - 60Hz 的动画是如何工作的?

ios允许特定数量的线程同时使用一个方法

java - 多级锁会导致多线程程序死锁吗?

java - java.sql.SQLException "database in auto-commit mode"的原因

java - 无法播放音频文件

java.lang.verifyerror on googleplayservices adView class instantiation

linux -/proc/thread-self 的用途?

c# - 通过线程以一定的时间间隔执行任务一定次数

python - 如何在Python中使用锁允许多个线程更改对象的不同部分?