我对这行代码有疑问:
class S1Es3SharedState {
//lock
private final Lock lock = new ReentrantLock();
private int x = 0;
public int getX() {
lock.lock();
try {
return x;
} finally {
lock.unlock();
}
}
public void incrementX() {
lock.lock();
try {
this.x = x++;
} finally {
lock.unlock();
}
}
}
同一个对象在 getX 方法和 incrementX 方法中锁定语句是什么意思?
如果我理解这意味着同一个对象用于锁定两个方法的语句,因此,如果两个方法都是空闲的,则线程可以进入其中一个方法,对吗?
例如:
ThreadA 在里面getX 方法,现在有一个上下文切换,因此 ThreadA 正在等待(在方法内部)而 ThreadB 正在运行并希望进入 getX() 方法但它不能,因为已经有 ThreadA。此外,如果 ThreadB 需要进入 incrementX 方法,它仍然不能,因为 ThreadA 在 getX 方法中。所以我使用的锁对象允许进入一个线程,只要这两个方法都是免费的(没有正在运行的线程)。有可能的?发生这种情况是因为我使用了同一个对象来锁定 getX 和 incrementX 方法。
最佳答案
这意味着两个不同的线程T1和T2无法获取
并在同一时刻递增变量。
简单地说return x;
和this.x = x++;
是不能执行的
同时通过两个不同的线程 T1 和 T2。线程
先进入者获胜,只有当它完成并调用解锁时,
第二个将有机会自己获得锁
并做好他的工作。
关于java - 多线程 : Explicit locks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22238514/