我不确定我是否正确地解释了javadoc。当在调用lock方法并成功获得锁之后使用ReentrantLock时,您是否可以访问任何没有任何同步块的对象,并神奇地强制执行发生-之前关系?
我看不到ReentrantLock和我正在处理的对象之间有任何联系,这就是为什么我很难相信我可以安全地处理它们。但事实就是这样,还是我读错了javadoc?
发布于 2011-10-30 00:59:00
如果线程A修改了由锁保护的代码块CB1内的某个对象,然后释放了锁,而线程B进入了由同一锁保护的代码块,则线程B将在代码块CB1中看到线程A所做的修改。
如果两个线程读取和写入相同的共享状态,则对此状态的每次读取和写入都应由相同的锁保护。
发布于 2011-10-30 00:58:35
这是..。(互斥)锁:
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.
发布于 2011-10-30 00:59:04
这里面没有魔法。当且仅当访问一个对象的所有线程都使用相同的锁时,您才是安全的--可以是ReentrantLock锁,也可以是任何其他互斥锁,比如synchronized块。
existence ReentrantLock的理由是它提供了比synchronized更多的灵活性:例如,您可以尝试获取锁-使用synchronized是不可能的。
https://stackoverflow.com/questions/7940247
复制相似问题