1

我不确定我是否正确解释了 javadoc。当使用ReentrantLockafter 调用该lock方法并成功获得锁时,您是否可以访问任何没有任何同步块的对象并且神奇地强制执行happend-before 关系?

我看不出ReentrantLock和我正在处理的对象之间有任何联系,这就是为什么很难相信我可以安全地处理它们。但就是这样,还是我读错了javadoc?

4

3 回答 3

4

如果线程 A 修改了由锁保护的代码块 CB1 中的某个对象然后释放锁,并且线程 B 进入由同一锁保护的代码块,那么线程 B 将在代码中看到线程 A 所做的修改块 CB1。

如果两个线程读取和写入相同的共享状态,那么对该状态的每次读取和写入都应该由同一个锁保护。

于 2011-10-29T16:59:00.403 回答
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()调用之间的任何内容都保证一次只能由一个线程执行。

相关的 Oracle 教程可以在这里找到。

于 2011-10-29T16:58:34.963 回答
2

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

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

于 2011-10-29T16:59:04.247 回答