我不确定我是否正确解释javadoc。在调用ReentrantLock
方法并成功获得锁定后使用lock
时,您是否可以在没有任何同步块的情况下访问任何对象,并且可以神奇地执行之前发生的关系?
我没有看到ReentrantLock
和我正在处理的对象之间存在任何联系,这就是为什么很难相信我能安全地处理它们的原因。但情况确实如此,或者我在读javadoc错了吗?
答案 0 :(得分:4)
如果线程A修改了由锁保护的代码块CB1内的某个对象然后释放锁,并且线程B进入由同一个锁保护的代码块,则线程B将看到线程A完成的修改在代码块CB1中。
如果两个线程读写相同的共享状态,那么每个对该状态的读写都应该被同一个锁保护。
答案 1 :(得分:2)
这是......(互斥锁)锁:
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()
调用之间的任何内容都保证一次只能由一个线程执行。
答案 2 :(得分:2)
它没有任何魔力。当且仅当访问对象的所有线程使用相同的锁时,您才是安全的 - 无论是ReentrantLock
还是任何其他互斥锁,例如synchronized
块。
存在ReentrantLock
是合理的,因为它提供了比synchronized
更多的灵活性:例如,您可以尝试来获取锁定 - synchronized
不可能1}}。