Lock ReentrantLock。无法理解javadoc

时间:2011-08-11 12:37:29

标签: java locking

一个线程调用plus1,second- plus2。将是第一次改变?或者它不适用于第二次调用lock()的线程?

如果plus2不调用lock(),他将使用什么值?

public class Test {

private final ReentrantLock lock = new ReentrantLock();
private int first;

public void plus1() {
    lock.lock();
    try {
        first++;
    } finally {
        lock.unlock();
    }
}

public void plus2() {
    lock.lock();
    try {
        first += 2;
    } finally {
        lock.unlock();
    }
}

public int getFirst() {
    return first;
}

}

3 个答案:

答案 0 :(得分:4)

如果正在调用plus2()的第二个线程在第一个线程(即第一个线程当前执行plus1())之后开始执行,则必须等到锁被释放({ {1}}方法会阻止)。

如果lock.lock()不使用锁定,它可能会在plus2()(可能为0)或first的初始值上运行,具体取决于是否赋值(是否隐含了后增量)。因此,您无法确定将使用first + 1的哪个值。

答案 1 :(得分:1)

  

一个线程调用plus1,second- plus2。将是第一次改变?要么   它是否可用于第二次调用lock()的线程?

它取决于哪个线程首先获得锁定。如果第一个线程获得锁定,则第二个线程必须等到第一个线程释放它。

  

如果plus2不调用lock(),他将使用什么值?

这是不可预测的。你不能说。这就是为什么你需要锁来产生确定性的结果。

答案 2 :(得分:0)

是的,两个线程都会更改first。锁定的关键在于没有锁定,您可能会丢失其中一个更新。

锁的重入意味着如果线程A有锁,它可以再次锁定它。锁定/解锁是嵌套的。

如果plus2没有使用锁,那么它可能在增加之前或之后得到值,没有办法说明。