锁重入锁。Can';我不懂javadoc
一个线程调用plus1,第二个线程调用plus2。第一个改变是什么?或者它不适用于调用second timelock()的线程吗 如果plus2不调用lock(),他将使用什么值锁重入锁。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+
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()时,他的值不会更新?