Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对象上的java同步与此对象上的java同步_Java_Multithreading_Synchronize - Fatal编程技术网

对象上的java同步与此对象上的java同步

对象上的java同步与此对象上的java同步,java,multithreading,synchronize,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 (lo

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

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();
        }
    }
}

它很好用。但如果我将synchronized(lock)替换为synchronized(this),它将开始抛出IllegalMonitorStateException。为什么会这样?

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

由于
指示与
锁定
对象不同的当前对象

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

这样做绝对有效:

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

        done = false;
    }
}

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

lock.wait()也应更改为this.wait()。所以lock.notify()。@Alexei yep,但我的问题是“为什么会抛出此异常”,而不是“如何工作”u说:“这表明当前对象与lock对象不同。”是的,但是
这个
对象包含
对象,所以我认为在
这个
对象上同步应该会阻止类中所有成员上的所有操作。不是吗?我的意思是,在
上同步此
应该与在类的所有成员上同步一样工作,因为
表示整个对象并包含所有成员以回答第一个问题。不,它们不一样。@borune对任何对象进行同步都不会阻止任何操作,但另一个线程的另一个同步操作除外。所有其他封锁仅仅是协议,可以或不能在项目中实现。