gpt4 book ai didi

java - ReentrantReadWriteLock 和同步块(synchronized block)

转载 作者:行者123 更新时间:2023-12-01 13:06:08 25 4
gpt4 key购买 nike

如果我有一个ReentrantReadWriteLock,并且我将它用作同步块(synchronized block)中的锁,其他线程仍然可以释放它们的锁吗?

例如:

ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);

public void doSomething() {
synchronized(lock) {
lock.readLock().lock();
// do stuff
lock.readLock().unlock();
}
}

如果我调用 doSomething() 并且另一个线程已经持有读锁,该线程可以释放读锁吗?

当我进行 doSomething() 调用时,我将在 ReentrantReadWriteLock 上进行同步,然后尝试获取读锁。由于某些东西已经持有读锁,我将阻塞直到该锁被释放。我很想知道读锁是否可以被释放,因为我已经同步了锁本身。

最佳答案

在 ReentrantReadWriteLock 对象上进行同步似乎是一个极其糟糕的主意。您的示例是锁定两个完全独立的锁。首先,它锁定每个对象内置的互斥锁(在本例中为 ReentrantReadWriteLock 对象),然后锁定读锁。

任何时候你看到锁,你都应该问这个问题,“锁应该保护的不变量是什么?”这是问“如果没有锁的话,你的数据会以何种方式被破坏?”的另一种方式。

好的,synchronized(lock) 保护什么?

并且,lock.readLock().lock() 保护什么?

如果两个答案相同,那为什么要使用两个锁?

If it was up to me I wouldn't even include the read/write lock in the first place

您不妨将示例更改为:

Object lock = new Object();

public void doSomething() {
synchronized(lock) {
// do stuff
}

就您向我们展示的代码而言,它的行为不会有任何不同。 (不过,它可能会改变您的示例与您未向我们展示的其他代码交互的方式。)

关于java - ReentrantReadWriteLock 和同步块(synchronized block),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23255083/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com