Java锁和happend-before关系

Java锁和happend-before关系,java,concurrency,locking,java-memory-model,reentrantlock,Java,Concurrency,Locking,Java Memory Model,Reentrantlock,我不确定我对javadoc的解释是否正确。在调用lock方法并成功获得锁后使用ReentrantLock时,您是否可以在没有任何同步块的情况下访问任何对象,并且在关系被神奇地强制之前访问happend 我看不到ReentrantLock和我正在处理的对象之间有任何联系,这就是为什么很难相信我能安全地处理它们。但情况就是这样,还是我读错了javadoc?这是。。。(互斥)锁: 一次只能有一个线程持有锁,因此lock()和unlock()调用之间的任何调用都保证一次只能由一个线程执行 是。。。(互斥

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

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

这是。。。(互斥)锁:

一次只能有一个线程持有锁,因此
lock()
unlock()
调用之间的任何调用都保证一次只能由一个线程执行

是。。。(互斥)锁:

一次只能有一个线程持有锁,因此
lock()
unlock()
调用之间的任何调用都保证一次只能由一个线程执行


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


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

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


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

这里面没有什么魔力。如果且仅当访问对象的所有线程都使用相同的锁(无论是
ReentrantLock
还是任何其他互斥锁,如
synchronized
块)时,您才是安全的


可重入锁的存在是合理的,因为它提供了比同步锁更大的灵活性:例如,您可以尝试获取锁,而同步锁是不可能的。如果且仅当访问对象的所有线程都使用相同的锁(无论是
ReentrantLock
还是任何其他互斥锁,如
synchronized
块)时,您才是安全的


可重入锁定
的存在是合理的,因为它提供了比
同步
更大的灵活性:例如,您可以尝试获取锁定-不可能使用
同步

是的,谢谢,我知道它们是以独占方式执行的,但我的问题是,不同的线程是否会看到相同的状态。您所说的是java如何在每个线程中缓存变量。使用锁(或使用
synchronized
关键字)可以保证同步。我认为这更全面地回答了你的问题。特别是JLSYeah的第17.1节,谢谢,我知道它们是以独占方式执行的,但我的问题是,不同的线程是否会看到相同的状态。您所说的是java如何在每个线程中缓存变量。使用锁(或使用
synchronized
关键字)可以保证同步。我认为这更全面地回答了你的问题。特别是JLS第17.1节
void myMethod()
{

    myLock.lock();  // block until condition holds
    try 
    {
         // Do stuff that only one thread at a time should do
     } 
     finally 
     {
         myLock.unlock()
     }
}