关于多次锁定尝试,使用java.concurrent.ReentrantLock

jay*_*100 3 java multithreading locking reentrancy

我注意到以下代码块:

    final Lock s = new ReentrantLock();
    for(int i = 0 ; i < 1000 ; i++)
    {
        s.lock();
        System.out.println(i+" :" +s.tryLock()+" ");
    }
Run Code Online (Sandbox Code Playgroud)

印刷品:

0 :true 
1 :true 
2 :true 
3 :true 
...
Run Code Online (Sandbox Code Playgroud)

这很奇怪 - 我希望连续的锁失败,因为s永远不会被解锁.

这里有什么不好意思吗?

Bri*_*ach 10

Javadoc是你的朋友.你真的应该读它.

来自:ReentrantLock.lock()

如果当前线程已经保持锁定,则保持计数增加1并且该方法立即返回.


Cor*_*bin 6

我打赌你是从同一个线程一遍又一遍地锁定它.在这种情况下,线程已经拥有锁,因此成功获取锁(因为甚至不必获取锁).

ReentrantLock由最后成功锁定的线程拥有,但尚未解锁.当锁不是由另一个线程拥有时,线程调用锁将返回,成功获取锁.如果当前线程已拥有锁,则该方法将立即返回.这可以使用方法isHeldByCurrentThread()和getHoldCount()来检查.

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/locks/ReentrantLock.html


Lou*_*man 5

ReentrantLock专门设计的,以便同一个线程可以多次获得锁定.这就是"可重入"的含义.它意味着从一开始就表现出这种行为.