为什么在同步块中得到IllegalMonitorException?

TheLogicGuy
public static void main(String[] args) {
        String resource1 = "ratan jaiswal";
        Thread t1 = new Thread() {
            public void run() {
                synchronized (resource1) {
                    System.out.println("Thread 1: locked resource 1");
                    try {
                        Thread.sleep(100);
                    } catch (Exception e) {
                    }
                    try {
                        wait();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        };

        Thread t2 = new Thread() {
            public void run() {
                synchronized (resource1) {
                    System.out.println("Thread 2: locked resource 2");
                    try {
                        Thread.sleep(100);
                    } catch (Exception e) {
                    }
                }
            }
        };

        t1.start();
        t2.start();
    }

运行此代码后,我得到第16行是带有wait()调用的行

Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
    at java.lang.Object.wait(Native Method)
    at java.lang.Object.wait(Unknown Source)
    at ThreadSyncFromMark.deadlock.dead$1.run(dead.java:16)

为什么我会看到此异常,因为我看到这里一切都很好,因为t1在调用wait时拥有resource1的监视器

aya满

为什么我会看到此异常,因为我看到这里一切都很好,因为t1在调用wait时拥有resource1的监视器

是的,t1拥有的监视器resource1但是你不是在打电话resource1.wait(),而是在打电话this.wait()

您需要将synchronizewait()并且notify()全部放在同一个对象(监视器)上,以使事情按应有的方式工作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么有时在BeginInvoke块中得到NullReferenceException?

来自分类Dev

为什么我在GNU Radio的VCO块中只能得到零?

来自分类Dev

减少Java中同步块的范围会意外损坏我的ArrayList,为什么会这样?

来自分类Dev

减小Java中同步块的大小会意外损坏我的ArrayList,为什么会这样?

来自分类Dev

为什么我使用同步列表并且仍然得到ConcurrentModificationException

来自分类Dev

在同步方法内部的线程中的同步块会发生什么?

来自分类Dev

为什么 Observable 类中的方法是同步的?

来自分类Dev

同步块中的notify()

来自分类Dev

为什么 href 显示在块中,而法拉在块中?

来自分类Dev

为什么HDFS中的块这么大?

来自分类Dev

try块中的代码被忽略,为什么?

来自分类Dev

为什么我用这个不同步的代码反复得到相同的结果?

来自分类Dev

为什么即使我的方法是同步的,我也要通过2个线程得到不同的结果?

来自分类Dev

在同步方法内部的线程中的同步块会发生什么情况?

来自分类Dev

Java中的同步方法和同步块

来自分类Dev

Java中的同步和同步块

来自分类Dev

为什么在字段变量上进行同步并在同步块内对其进行递增操作会导致打印混乱?

来自分类Dev

为什么这个同步块要花很长时间才能获得锁?

来自分类Dev

为什么String类的构造方法与参数的StringBuffer使用同步块,而与StringBuilder的构造不?

来自分类Dev

为什么Java编译器在“同步块”之前添加“冗余读取”?

来自分类Dev

PHP 7中的同步块

来自分类Dev

了解Java中的同步块

来自分类Dev

简化Java中的同步块

来自分类Dev

main方法中的同步块

来自分类Dev

多线程中的同步块

来自分类Dev

为什么我在Matlab中得到错误的矩阵范数?

来自分类Dev

为什么我在JavaScript中得到“未定义”

来自分类Dev

为什么我在Golang的Date函数中得到错误答案

来自分类Dev

为什么我从此vimscript中得到E127?

Related 相关文章

  1. 1

    为什么有时在BeginInvoke块中得到NullReferenceException?

  2. 2

    为什么我在GNU Radio的VCO块中只能得到零?

  3. 3

    减少Java中同步块的范围会意外损坏我的ArrayList,为什么会这样?

  4. 4

    减小Java中同步块的大小会意外损坏我的ArrayList,为什么会这样?

  5. 5

    为什么我使用同步列表并且仍然得到ConcurrentModificationException

  6. 6

    在同步方法内部的线程中的同步块会发生什么?

  7. 7

    为什么 Observable 类中的方法是同步的?

  8. 8

    同步块中的notify()

  9. 9

    为什么 href 显示在块中,而法拉在块中?

  10. 10

    为什么HDFS中的块这么大?

  11. 11

    try块中的代码被忽略,为什么?

  12. 12

    为什么我用这个不同步的代码反复得到相同的结果?

  13. 13

    为什么即使我的方法是同步的,我也要通过2个线程得到不同的结果?

  14. 14

    在同步方法内部的线程中的同步块会发生什么情况?

  15. 15

    Java中的同步方法和同步块

  16. 16

    Java中的同步和同步块

  17. 17

    为什么在字段变量上进行同步并在同步块内对其进行递增操作会导致打印混乱?

  18. 18

    为什么这个同步块要花很长时间才能获得锁?

  19. 19

    为什么String类的构造方法与参数的StringBuffer使用同步块,而与StringBuilder的构造不?

  20. 20

    为什么Java编译器在“同步块”之前添加“冗余读取”?

  21. 21

    PHP 7中的同步块

  22. 22

    了解Java中的同步块

  23. 23

    简化Java中的同步块

  24. 24

    main方法中的同步块

  25. 25

    多线程中的同步块

  26. 26

    为什么我在Matlab中得到错误的矩阵范数?

  27. 27

    为什么我在JavaScript中得到“未定义”

  28. 28

    为什么我在Golang的Date函数中得到错误答案

  29. 29

    为什么我从此vimscript中得到E127?

热门标签

归档