欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java Object wait方法详细介绍

程序员文章站 2024-03-07 15:07:27
java object wait方法 当线程b访问某个共享资源时,想获取资源的锁对象,发现这个锁已经被线程a拿到了,这个时候,线程b只能被挂起,等待线程a释放锁。 但是...

java object wait方法

当线程b访问某个共享资源时,想获取资源的锁对象,发现这个锁已经被线程a拿到了,这个时候,线程b只能被挂起,等待线程a释放锁。

但是拿到锁的线程a在执行的过程中,因为某些条件还不满足,暂时不想继续执行下去,想先等待一下(注意:是已经拿到锁的线程a自己想主动等待的),希望等到某个条件满足后,继续执行任务。在同步代码块里,线程a必须先释放锁,线程b才有资格获取锁,进入同步代码块,执行代码。等线程b执行完后,线程a需要的条件已经满足,那么这个时候必须有一个通知机制,让线程a从等待状态变成执行状态,继续执行代码。

有些同学认为线程a也可以一直循环判断,检查条件是否已经满足,而不一定要中断自己,然后等待。其实这种也是一种思路,但是呢?比较耗cpu,而且也不知道条件何时才能满足。

线程之间要协调沟通,必须有一个等待机制和通知机制,在java里面,对应的就是wait方法和notify方法。

object的wait方法

 
synchronized (obj) {
    while (condition does not ok){
      obj.wait();
    }
 }

如果想让线程a处于等待状态,可以调用当前对象wait方法。wait方法一旦被调用,也就意味着:线程a已经获得锁了,而且能做的事情都已经做了,现在只能等待了,等待另外的同步操作执行某些代码后,我才回来继续干活。

注意:

wait方法是定义在根类object上的,thread继承自object类,自然也有wait方法。但是这里并不是调用当前线程对象的wait方法,而是具有锁属性的当前对象的wait方法;这一点我也不太理解,我觉得要做到线程a切换到等待状态,之后被人唤醒,就算使用线程a的wait方法和notify方法其实也是可以做到的,但是估计实现起来非常麻烦。另外从场景上看,wait定义在object也比较合理,表示线程挂在了对象的等待池中。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!