当前位置: 首页 > 知识库问答 >
问题:

使用时为IllegalMonitorStateException。当“this”not[duplicate]时类为监视器

和魁
2023-03-14

我只是编写了一个程序,使用两个线程轮流打印0-99。我使用同步块来完成任务。在我的代码中,当我使用“this”作为同步监视器时,程序工作得很好。但是当我使用“.class”作为同步监视器时,我得到了illegalMonitorStateException。有人能说出发生了什么吗?

这是我的代码,运行良好

public class WaitTest implements Runnable {
    private int n = 0;

    @Override
    public void run() {
        while (true) {
            synchronized (this){
                notify();
                if (n < 100) {

                    System.out.println(Thread.currentThread().getName() + " " + Integer.toString(n));
                    ++n;
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    try {
                        wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                } else
                    break;
            }
        }
    }

    public static void main(String[] args) {
        WaitTest waitTest = new WaitTest();
        Thread threadA = new Thread(waitTest);
        Thread threadB = new Thread(waitTest);
        threadA.start();
        threadB.start();
    }
}

这是我的代码,我有一个例外

public class WaitTest implements Runnable {
    private int n = 0;

    @Override
    public void run() {
        while (true) {
            synchronized (WaitTest.class){
                notify();
                if (n < 100) {

                    System.out.println(Thread.currentThread().getName() + " " + Integer.toString(n));
                    ++n;
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    try {
                        wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                } else
                    break;
            }
        }
    }

    public static void main(String[] args) {
        WaitTest waitTest = new WaitTest();
        Thread threadA = new Thread(waitTest);
        Thread threadB = new Thread(waitTest);
        threadA.start();
        threadB.start();
    }
}

它们之间唯一的区别是同步后大括号中的内容

共有1个答案

常海
2023-03-14

在我的代码中,当我使用“this”作为同步监视器时,程序工作得很好。

这是因为当您调用wait()notify()方法时,您是从this返回的实例隐式调用它们,该实例与您的synchronized子句(即synchronized(this))中使用的对象相匹配。

但是当我使用“.class”作为同步监视器时,我得到了IllegalMonitorStateException。

发生这种情况的原因是,您同步了WaitTest.class类,但为This实例再次调用了WaitNotify方法。因此,要避免该异常,请更改wait()的调用;将notify();分别添加到waittest.class.wait();waittest.class.notify();

修正的代码:

public class WaitTest implements Runnable {
    private int n = 0;

    @Override
    public void run() {
        while (true) {
            synchronized (WaitTest.class){
                WaitTest.class.notify();
                if (n < 100) {

                    System.out.println(Thread.currentThread().getName() + " " + Integer.toString(n));
                    ++n;
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    try {
                        WaitTest.class.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                } else
                    break;
            }
        }
    }

    public static void main(String[] args) {
        WaitTest waitTest = new WaitTest();
        Thread threadA = new Thread(waitTest);
        Thread threadB = new Thread(waitTest);
        threadA.start();
        threadB.start();
    }
}
 类似资料:
  • 我刚开始使用线程,一调用wait方法就会得到一个IllegalMonitorStateException,有人能帮我吗

  • 我有个问题。当我在synchronized块中使用时,我有IllegalMonitorStateException。有谁能帮我解决这个问题吗? 我必须这样做,一个线程将发送到第二个线程char,然后这个线程必须等待和第二个线程打印这个char。在第二个线程等待之后,第一个线程再次发送下一个字符 main.java:

  • 问题内容: 我正在Swift iOS应用程序中使用类型的参数列表来保存一些最终将传递给Web服务的参数。如果我将Bool保存到此字典中然后打印,它会显示为“ Optional(1)”,因此正在将其转换为int。我无法发送一个int,并且需要将其设为“ true”。下面的示例代码。 我怎样才能将其保存为实际的true / false值而不是整数? 注意事项 这与AFNetworking一起使用,因此

  • 我在下面的代码中的处获得了一个concurrentModificationException。我怎样才能避免这种情况呢? 这是stacktrace的顶部

  • 问题内容: 我在Java中为程序使用多线程。我已经成功运行了线程,但是当我使用线程时,它正在抛出。如何使线程等待通知它? 问题答案: 你需要先行一步才能工作。 另外,我建议你查看并发程序包,而不是旧式的线程程序包。它们更安全,更易于使用。 快乐的编码。 编辑 我以为你的意思是,当你尝试在不持有对象锁定的情况下获取访问权限时会发生异常。

  • 问题内容: 我有一个javascript类,每个方法都返回一个Promise。我想知道为什么在和中未定义。有没有更正确的方法来编写此代码? 我可以使用以下方法解决此问题: 但是不能完全确定为什么有必要。正在消灭? 问题答案: 始终是调用方法的对象。但是,将方法传递给时,您不会调用它!该方法将存储在某个地方,稍后再从那里调用。如果要保存,则必须这样做: 或者,如果您必须在ES6 之前的版本中进行操作