【问题标题】:when the thread will release the lock on object?什么时候线程会释放对象上的锁?
【发布时间】:2015-10-12 18:41:57
【问题描述】:

我是多线程的新手。目前我正在学习锁、通知和同步块。我创建了一个小程序来检查等待和通知如何使用同步块,如果我不创建任何线程(我认为主线程将获得锁)。下面是更好理解的代码。

public class Problem1 
{
    public void waitForSignal() throws InterruptedException
    {
        Object obj=new Object();
        synchronized (obj) {
        obj.wait();
        obj.notify();
        }
    }
    public static void main(String args[]) throws InterruptedException
    {
        Problem1 pb=new Problem1();
        pb.waitForSignal();
        System.out.println("hello");//controll not come here
    }

}

如果我运行上面的程序,它会卡住。并且控制既不会转到 notify() 也不会退出同步块。为什么代码会这样。 我试图在谷歌上搜索,我发现了以下声明

wait() 告诉调用线程放弃监视器并转到 休眠直到其他线程进入同一个监视器并调用 通知()。

我从上面的语句中了解到,为了正确执行我的程序,我必须创建另一个线程,该线程将进入同一个监视器并中断当前锁持有线程的执行。如果我错了,请纠正我。 请我更正上面的代码,这样它就可以在没有卡住的情况下正常工作。

【问题讨论】:

标签: java multithreading locking synchronized


【解决方案1】:

当您调用wait 时,其他一些线程将不得不获取obj 上的锁并调用notifynotifyAll 以指示等待线程继续。最容易理解的方法是在消费者/生产者问题的上下文中,Oracle 有一个关于that 的非常好的教程。

线程中断是完全不同的东西。它是被中断线程检查其中断状态并终止处理的请求。 Brian Goetz 在properly handling InterruptedException 的背景下有一篇很棒的文章。

【讨论】:

  • 感谢您的回复,但是如果您看到我的程序,控件不会转到 notify() 调用,因此没有机会为等待线程生成任何类型的信号。你能解释一下吗?参考我的程序。
  • 控制没有转到notify 调用,因为线程被阻塞。使用wait 的唯一原因是与另一个线程协调活动。我建议将您的程序放在一边并阅读教程。
  • 你还在等什么?你想发出什么通知?我建议在继续之前对这些问题有一个很好的答案,因为脱离上下文等待和通知只会导致混乱。
  • @vijayram,换句话说,obj.wait() 调用将不会返回,直到某个 other 线程调用 obj.notify()。这就是 wait() 和 notify() 的用途。在只有一个线程的程序中,你不能用 wait() 和 notify() 做任何有用的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-01
  • 2013-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多