锁重入锁。Can';我不懂javadoc

锁重入锁。Can';我不懂javadoc,java,locking,Java,Locking,一个线程调用plus1,第二个线程调用plus2。第一个改变是什么?或者它不适用于调用second timelock()的线程吗 如果plus2不调用lock(),他将使用什么值 public class Test { private final ReentrantLock lock = new ReentrantLock(); private int first; public void plus1() { lock.lock(); try { first+

一个线程调用plus1,第二个线程调用plus2。第一个改变是什么?或者它不适用于调用second timelock()的线程吗

如果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;
}

}

是,两个线程将首先更改
。锁定的要点是,如果没有锁定,您可能会丢失其中一个更新

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


如果plus2没有使用锁,那么它可能会在增量之前或之后获得值,这是无法判断的。

是的,两个线程都会先更改
。锁定的要点是,如果没有锁定,您可能会丢失其中一个更新

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

如果plus2没有使用锁,那么它可能会在增量之前或之后获得值,这是无法判断的

一个线程调用plus1,第二个线程调用plus2。第一个改变是什么?或 调用第二次锁定()的线程不可用吗

这取决于哪个线程首先获得锁。如果第一个线程获得锁,第二个线程将不得不等待,直到第一个线程释放它

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

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

一个线程调用plus1,第二个线程调用plus2。第一个改变是什么?或 调用第二次锁定()的线程不可用吗

这取决于哪个线程首先获得锁。如果第一个线程获得锁,第二个线程将不得不等待,直到第一个线程释放它

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


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

如果调用
plus2()
的第二个线程在第一个线程(即当前执行的第一个线程
plus1()
)之后开始执行,则必须等待锁被释放(
lock.lock()
方法将被阻止)


如果
plus2()
不使用锁,它可能会对
first
的初始值(即0)或
first+1
进行操作,这取决于是否发生了赋值(这是增量后隐式的)。因此,您无法确定将使用
第一个
的哪个值。

如果调用
plus2()
的第二个线程在第一个线程(即当前执行的第一个线程
plus1()
)之后开始执行,则必须等待锁释放(
lock.lock()
方法将阻塞)


如果
plus2()
不使用锁,它可能会对
first
的初始值(即0)或
first+1
进行操作,这取决于是否发生了赋值(这是增量后隐式的)。因此,您无法确定将首先使用
的哪个值。

您的问题很难理解(至少对我来说)。
plus1
plus2
都修改了
first
字段,因此看起来该字段将被修改两次,尽管不是同时修改。。。很难说你在问什么。在这种情况下,锁不需要重新进入。不能从使用锁的另一个方法调用使用锁的方法。因此,一个线程不能在调用堆栈中两次进入锁。您还需要在getFirst()中使用锁,否则调用getFirst()的线程可能永远看不到其他方法所做的更改。您的问题很难理解(至少对我来说)。
plus1
plus2
都修改了
first
字段,因此看起来该字段将被修改两次,尽管不是同时修改。。。很难说你在问什么。在这种情况下,锁不需要重新进入。不能从使用锁的另一个方法调用使用锁的方法。因此,一个线程永远不能在调用堆栈中两次进入锁。您还需要在getFirst()中使用锁,否则调用getFirst()的线程可能永远看不到其他方法所做的更改(感谢您的回复)现在我更有信心)如果字段首先生成AtomicInteger,则在某些线程调用unlock()时,他的值不会更新?感谢您的回复)现在我更有信心了)若字段首先生成AtomicInteger,当一些线程调用unlock()时,他的值不会更新?