java在对象上同步与在this上同步

标签 java multithreading synchronize

我想编写自己的简单信号量并按如下方式完成:

class Semaphore {
    private boolean done;
    private final Object lock = new Object();

    public Semaphore(boolean done){ this.done = done;}

    public void acquire() throws InterruptedException {
        synchronized (lock) {
            while (!done)
                lock.wait();

            done = false;
        }
    }

    public void release() {
        synchronized (lock) {
            done = true;
            lock.notify();
        }
    }
}

效果很好。但是,如果我用同步(this)替换同步(锁),它就会开始抛出IllegalMonitorStateException。为什么会这样?

最佳答案

正如 @Alexei Kaigorodov 在评论中提到的,当您将 synchronized (lock) 替换为 synchronize (this) 时。然后,您还需要将代码中的 lock 替换为 this

由于 this 指示当前对象,该对象与 lock 对象不同。

现在,您将 synchronized (lock) 替换为 synchronize (this) 这意味着现在您正在尝试获取当前对象的锁,但您正在等待 Object 的对象类。

这绝对没问题:

public void acquire() throws InterruptedException {
    synchronized (this) {
        while (!done)
            this.wait();

        done = false;
    }
}

public void release() {
    synchronized (this) {
        done = true;
        this.notify();
    }
}

关于java在对象上同步与在this上同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44926260/

相关文章:

multithreading - Synchronize() 挂起线程

java - 如何将我的 Android Eclipse 项目迁移到使用 Gradle 和 Android Studio?

Java继承为什么这个toString打印BB而不是AB,AB?

java - 避免返回 LIST 时可能出现的并发问题

android - 如何立即刷新 ImageView

java - 为什么我们不能在 Java 中将整个类声明为同步的?

java - 我的程序没有显示代码?

java - 单击按钮更新时间

c# - 两个或多个线程可以毫无问题地迭代同一个 List<t> 吗?

c++ - 实现线程安全数组