当多个线程想要访问 ReentrantReadWriteLock 时会发生啥?
Posted
技术标签:
【中文标题】当多个线程想要访问 ReentrantReadWriteLock 时会发生啥?【英文标题】:what happens when multiple threads want to access a ReentrantReadWriteLock?当多个线程想要访问 ReentrantReadWriteLock 时会发生什么? 【发布时间】:2011-08-19 16:20:44 【问题描述】:当应用 reentrantReadWriteLock 并且它被锁定时,如果另一个线程在执行另一个块时访问该锁会发生什么? (因此,在它到达 .unlock 之前)
方法被取消了吗?或者它已经停滞不前了? :O
【问题讨论】:
锁的全部意义在于,如果其他人试图在原始储物柜解锁之前锁定它,那么他们就会被阻止直到它解锁。这样,对于线程来说,它所知道的就是它锁定、执行它的操作和解锁,并且知道当它在里面时它是唯一的。 【参考方案1】:既然您说的是 ReentrantReadWriteLock,那么行为取决于您是在谈论获取读锁还是与 ReadWriteLock 关联的写锁。
-
如果你试图获取写锁,你将被阻塞,直到所有持有者释放锁(无论是读锁还是写锁)
如果您尝试获取读锁并且没有写锁持有者,您将始终能够获取它即使还有其他读锁持有者
如果您尝试获取读锁并且有写锁持有者,您将被阻塞,直到写锁持有者释放写锁
只要没有写入器,读锁就可以被多个线程同时持有。
【讨论】:
【参考方案2】:线程将阻塞,直到锁可用。 (docs)
如果你只想获取可用的锁,你可以使用tryLock()
【讨论】:
【参考方案3】:线程将阻塞。如果有多个线程试图获取这个锁,它们都会被阻塞。当锁被释放时,等待池中的一个线程将获得锁,其余的仍将等待。查看公平锁和不公平锁之间的difference。
【讨论】:
【参考方案4】:如果您不想阻止,可以使用Lock.tryLock()
(无需等待即可尝试)或tryLock(long time, TimeUnit unit)
,它只会等待您指定的时间。
【讨论】:
以上是关于当多个线程想要访问 ReentrantReadWriteLock 时会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章