我对这行代码有疑问:
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 方法。
答案 0 :(得分:2)
这意味着两个不同的线程T1和T2无法获得 并在同一时刻递增变量。
简单地说return x;
和this.x = x++;
无法执行
同时由两个不同的线程T1和T2组成。线程
进入第一次胜利,只有当它完成并且呼叫解锁时,
第二个将有机会获得自己的锁
做他的工作。