当多个线程想要访问ReentrantReadWriteLock时会发生什么?

时间:2011-08-19 16:20:45

标签: java multithreading locking reentrantreadwritelock

当应用reentrantReadWriteLock并且它被锁定时,如果另一个线程在已经执行另一个块时访问Lock会发生什么? (因此,在它到达.unlock之前)

方法被取消了吗?或许它停滞不前? :o

4 个答案:

答案 0 :(得分:2)

由于你说的是ReentrantReadWriteLock,行为取决于你是在谈论读锁还是与ReadWriteLock相关的写锁。

  1. 如果您正在尝试获取写锁定,则将被阻止,直到所有持有者释放锁定(无论是读取锁定还是写入锁定)
  2. 如果您尝试获取读锁定并且没有写锁定的持有者,即使还有其他读取锁定持有者,您也将始终能够获取
  3. 如果您正在尝试获取读锁定并且存在写锁定的持有者,则在写锁定持有者释放写锁定之前,您将被阻止
  4. 只要没有编写器,读锁就可以由多个线程同时保存。

答案 1 :(得分:1)

线程将阻塞,直到锁定可用。 (docs)

如果您只想获取锁定,则可以使用tryLock()

答案 2 :(得分:1)

该线程将被阻止。如果多个线程尝试获取此锁定,则所有线程都将被阻止。释放锁定时,等待池中的一个线程将获得锁定,其余线程仍将等待。请参阅公平和不公平锁定之间的difference

答案 3 :(得分:0)

如果您不想阻止,可以使用Lock.tryLock()(无需等待尝试)或tryLock(long time, TimeUnit unit),只会在您指定的时间内等待。