Java锁定和之前发生的关系

时间:2011-10-29 16:49:55

标签: java concurrency locking java-memory-model reentrantlock

我不确定我是否正确解释javadoc。在调用ReentrantLock方法并成功获得锁定后使用lock时,您是否可以在没有任何同步块的情况下访问任何对象,并且可以神奇地执行之前发生的关系?

我没有看到ReentrantLock和我正在处理的对象之间存在任何联系,这就是为什么很难相信我能安全地处理它们的原因。但情况确实如此,或者我在读javadoc错了吗?

3 个答案:

答案 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()调用之间的任何内容都保证一次只能由一个线程执行。

The relevant Oracle tutorial can be found here.

答案 2 :(得分:2)

它没有任何魔力。当且仅当访问对象的所有线程使用相同的锁时,您才是安全的 - 无论是ReentrantLock还是任何其他互斥锁,例如synchronized块。

存在ReentrantLock是合理的,因为它提供了比synchronized更多的灵活性:例如,您可以尝试来获取锁定 - synchronized不可能1}}。