【发布时间】:2019-03-12 12:36:52
【问题描述】:
这可能是一个非常愚蠢的问题。我正在阅读包java.util.concurrent.atomic 和java.util.concurrent.locks 中的接口和类的文档。我到处都能找到
void lock() – 获取锁(如果可用);如果锁不可用,则线程将被阻塞,直到锁被释放
我不确定的是,究竟是什么资源被锁定了?代码sn-p示例展示
Lock lock = new ReentrantLock();
lock.lock();
try {
// access to the shared resource
} finally {
lock.unlock();
}
在lock() 的调用下使用的任何东西都会被锁定吗?在到达那条线之前,JVM 是如何知道这一点的?如果lock() 和unlock() 之间有多个资源怎么办?我想我有这个问题是因为我在阅读 synchronization 之后正在阅读这个问题,并且它有非常具体的方式来说明要锁定的内容 - 比如:synchronized(resourceReferenceThatNeedsToBeLocked)
我研究了很多,但找不到这个问题的答案。
【问题讨论】:
-
没有资源被锁定,但执行某些指令的线程被阻止继续。线程只不过是一系列指令的独立执行。多个线程可能执行相同或不同的指令,这并不重要。如果他们想访问由同一个锁保护的关键部分,他们将竞争锁。无法获得锁的线程将等到锁再次可用并再次竞争它。这可能会导致线程拥塞,在最坏的情况下会导致死锁。
标签: java multithreading