bkbai 2020-04-12 03:39 采纳率: 100%
浏览 140
已采纳

Java中线程锁问题,拜托了。

请问不能编译通过原因是什么呢?
还有obj.wait();是什么意思呢?
obj是一个线程吗?

public class Test {

    private Object obj = new Object();
    public synchronized void a() {
        try {
            obj.wait();
            System.out.println("waiting");
        } catch (InterruptedException e) {
            System.out.println("Exception");
        }
    }
    public static void main(String[] args) {
        new Test().a();
    }

}
  • 写回答

3条回答 默认 最新

  • lIlIlllllIII 2020-04-12 08:46
    关注
    • 调用wait就会把当前线程放到条件队列上并阻塞,表示当前线程执行不下去了,它需要等待一个条件,这个条件它自己改变不了,需要其他线程改变。当其他线程改变了条件后,应该调用Object的notify方法
    • wait()和notify()方法的调用必须具有内置锁 synchronized(this) 的代码块内或同步方法中调用才会不抛出IllegalMonitorStateException异常

    你的a()方法上没加static,锁住的是调用的对象 也就是你创建的new Test()这个对象
    然后你再让这个对象里面的obj对象等待之前要尝试获得对象锁

        private Object obj = new Object();
        public synchronized void a() {
            synchronized (obj) {
                try {
                    obj.wait();
                    System.out.println(Thread.currentThread().getName() + "\twaiting");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    
        public static void main(String[] args) {
            Test test = new Test();
            new Thread(() -> {
                try { Thread.sleep(1000);} catch (InterruptedException e) { e.printStackTrace();}
                synchronized (test.obj) {
                    test.obj.notify();
                }
            }, "myThread_01").start();
            test.a();
        }
    

    main waiting

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥50 关于在matlab上对曲柄摇杆机构上一点的运动学仿真
  • ¥15 jetson nano
  • ¥15 :app:debugCompileClasspath'.
  • ¥15 windows c++内嵌qt出现数据转换问题。
  • ¥20 公众号如何实现点击超链接后自动发送文字
  • ¥15 用php隐藏类名和增加类名
  • ¥15 算法设计与分析课程的提问
  • ¥15 用MATLAB汇总拟合图
  • ¥15 智能除草机器人方案设计
  • ¥15 对接wps协作接口实现消息发送