java - 多线程 : Explicit locks

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

最佳答案

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

简单地说return x;this.x = x++;是不能执行的
同时通过两个不同的线程 T1 和 T2。线程
先进入者获胜,只有当它完成并调用解锁时,
第二个将有机会自己获得锁
并做好他的工作。

关于java - 多线程 : Explicit locks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22238514/

相关文章:

java - 使用java进行AES解密

java - 如何使用 Eclipse 连接到带有 Hibernate 的 MySql

java - 如何在intellij IDEA中设置默认数据库

java - H2数据库中的模糊匹配?

java - 在词法分析器规则中使用标记类型进行正向前瞻

java - 验证用户输入时无限循环

java - Vaadin 14 如何将 vaadin servlet 移动到不同的 URL?

java - 我按照 oracle 中关于 JLayer 的教程进行操作,但它不适用于此代码

java - 找到两点之间的最短路径,动态规划

JavaFX Maven jfx :jar error: Could not find artifact javafx-packager