我不确定我是否正确解释了 javadoc。当使用ReentrantLock
after 调用该lock
方法并成功获得锁时,您是否可以访问任何没有任何同步块的对象并且神奇地强制执行happend-before 关系?
我看不出ReentrantLock
和我正在处理的对象之间有任何联系,这就是为什么很难相信我可以安全地处理它们。但就是这样,还是我读错了javadoc?
我不确定我是否正确解释了 javadoc。当使用ReentrantLock
after 调用该lock
方法并成功获得锁时,您是否可以访问任何没有任何同步块的对象并且神奇地强制执行happend-before 关系?
我看不出ReentrantLock
和我正在处理的对象之间有任何联系,这就是为什么很难相信我可以安全地处理它们。但就是这样,还是我读错了javadoc?
如果线程 A 修改了由锁保护的代码块 CB1 中的某个对象然后释放锁,并且线程 B 进入由同一锁保护的代码块,那么线程 B 将在代码中看到线程 A 所做的修改块 CB1。
如果两个线程读取和写入相同的共享状态,那么对该状态的每次读取和写入都应该由同一个锁保护。
这是......一个(互斥锁)锁:
void myMethod()
{
myLock.lock(); // block until condition holds
try
{
// Do stuff that only one thread at a time should do
}
finally
{
myLock.unlock()
}
}
一次只有一个线程可以持有锁,因此lock()
和unlock()
调用之间的任何内容都保证一次只能由一个线程执行。
它没有魔法。当且仅当所有访问对象的线程都使用相同的锁时,您才是安全的——无论是一个ReentrantLock
互斥锁还是任何其他互斥锁,例如一个synchronized
块。
它的存在ReentrantLock
是合理的,因为它提供了比 更多的灵活性synchronized
:例如,您可以尝试获取锁 - 这是不可能的synchronized
。