一个线程调用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;
}
}
答案 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没有使用锁,那么它可能在增加之前或之后得到值,没有办法说明。