当多个线程想要访问 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 时会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

实体框架:如何防止 dbcontext 被多个线程访问?

多线程--对象及变量的并发访问

多个线程同时写入多个文件 - 它正被另一个进程使用

互联网并发编程一

线程安全小结

多线程篇五:多个线程访问共享对象和数据的方式