多线程:显式锁定

时间:2014-03-06 23:38:21

标签: java

我对这行代码有疑问:

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 方法。

1 个答案:

答案 0 :(得分:2)

这意味着两个不同的线程T1和T2无法获得 并在同一时刻递增变量。

简单地说return x;this.x = x++;无法执行 同时由两个不同的线程T1和T2组成。线程
进入第一次胜利,只有当它完成并且呼叫解锁时,
第二个将有机会获得自己的锁 做他的工作。