java 对象的wait/notify详解

原创 2018年04月15日 15:00:20

java 对象的wait,notify方法是Object类定义的final方法,是无法被重新的,这两个方法的定位是多线程中,控制多个线程对共享资源的调用(典型的如生产者消费者模型), 这两种方法必须在当前线程拥有对象锁monitor的情况下使用,否则会抛出异常。

下面假设共享资源为Queue  queue; 分别说明这两中方法的使用方法。

wait 方法:当前线程已经进入了同步锁的线程的情况下,让自己暂时让出同步锁,并让当前线程进入阻塞状态。以便其他正在等待此锁的线程可以得到同步锁并运行,不带参数调用wait( )==wait(0),表示无限等待,必须要其他的线程调用queue.notify()或者queue.notifyAll()方法才能唤醒。如果当前线程调用带参数方法queue.wait(1000),那么当前线程会进入阻塞,并让出同步锁。

notify/notify方法queue.notifyAll()是当前线程通知其它所有因等待工作资源queue而进入阻塞状态的线程,告诉它们:"等待的兄弟们,我马上要用完资源了,等我释放资源后,你们就可以参与queue资源的争夺了,做好抢的整备吧"其他等待该资源的线程会收到这条"广播";queue.notify( )方法会随机的唤醒一个等待wait资源的线程。

wait和nitify通常在并发任务中配合使用的。请看下面的生产者消费者示例

package thread;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Random;

public class ProducerConsumerInJava {
    private static volatile Queue<Integer> queue = new LinkedList<Integer>();

    public static void main(String[] args) {
        Thread produce = new Produce(queue);
        Thread consume = new Consume(queue);
        produce.start();
        consume.start();

    }

}

class Produce extends Thread {
    private Queue<Integer> queue;

    public Produce(Queue<Integer> queue) {
        this.queue = queue;
    }

    @Override
    public void run() {
        while (true) {
            synchronized (queue) {
                if (queue.size() == 100) {
                    try {
                        queue.wait();// 运行了此处后,此时此刻不会执行int a=0;只有被其他线程唤醒,才会接着执行int 1=0;
                        int a = 0;
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                } else {
                    int random = new Random().nextInt();
                    queue.add(random);
                    System.out.println("生成一个产品:" + random);
                }
                queue.notifyAll();
            }
        }
    }
}

class Consume extends Thread {
    Queue<Integer> queue;

    public Consume(Queue<Integer> queue) {
        this.queue = queue;
    }

    @Override
    public void run() {
        while (true) {
            synchronized (queue) {
                if (queue.isEmpty()) {
                    try {
                        queue.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                } else {
                    Integer remove = queue.remove();
                    System.out.println("消费一个产品:" + remove);
                }
                queue.notifyAll();
            }
        }
    }
}


Java并发编程(详解wait(), notify(),sleep())

上一篇博客,重点讲解了java中锁的机制,省的在多线程之间出现混乱的局面,其实主要能够理解钥匙即可。如果要保证方法之间能够独立完全的执行,因此就必须所有的方法都共用一把钥匙。然后小编最后也总结了一下,...
  • ZHOUCHAOQIANG
  • ZHOUCHAOQIANG
  • 2015-09-02 17:15:40
  • 2359

Java Object对象中的wait,notify,notifyAll通俗理解

wait,notify,notifyAll 是定义在Object类的实例方法,用于控制线程状态。三个方法都必须在synchronized 同步关键字所限定的作用域中调用,否则会报错java.lang....
  • vk5176891
  • vk5176891
  • 2016-12-30 18:33:48
  • 2391

Java wait() notify()方法使用实例讲解

1)wait()、notify()和notifyAll()方法是本地方法,并且为final方法,无法被重写。   2)调用某个对象的wait()方法能让当前线程阻塞,并且当前线程必须拥有此对象的mon...
  • lingzhm
  • lingzhm
  • 2015-04-08 14:54:37
  • 26439

Java对象锁wait()/notify()的一点理解

wait()和notify()是用来 做线程同步用的, 他们都必须在synchronized语句块中调用。 进入synchronized块表示获得了对象锁,离开synchronized块表示释放了对...
  • gemmem
  • gemmem
  • 2012-07-17 16:11:59
  • 3737

java wait和notify 简单理解

/**  * @author yangwl  *   * wait  noify  noifyall  * 注意 : 因为涉及到对象锁,他们必须都放在synchronized中来使用.  *...
  • cnm_1314
  • cnm_1314
  • 2016-09-13 17:01:40
  • 817

java线程的sleep(),wait(),notify(),yield()方法的区别要点

java线程的sleep(),wait(),notify(),yield();以前看的,很久不用忘了,现在把区别的要点重新整理一下:1.sleep()使线程休眠一段时间,一段时间结束后,线程进入可执行...
  • flowing_water
  • flowing_water
  • 2007-11-01 17:33:00
  • 6264

wait和notify的理解与使用

1.对于wait()和notify()的理解对于wait()和notify()的理解,还是要从jdk官方文档中开始,在Object类方法中有: void notify() Wakes ...
  • jianiuqi
  • jianiuqi
  • 2016-12-03 23:09:56
  • 10587

Java wait、notify与synchronized的奇妙之处

synchronized是Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。synchronized就是针对内存区块申请内存锁。(1)JA...
  • chy555chy
  • chy555chy
  • 2016-08-22 19:26:57
  • 2645

java多线程中的synchronized和wait/notify用法总结

自学java也有一段时间了,自我感觉java中的多线程还是比较重要的。至于线程的概念,也没有必要说的那么玄乎,引用马士兵老师的话就很好理解:线程就是程序执行的路径。多线程,也就不难理解了,程序执行的多...
  • gtkknd
  • gtkknd
  • 2016-01-21 15:42:54
  • 635

若还 不懂 java synchronized 同步,锁,对象wait,notify问题,看完这两段代码,解决问题。

看代码很累,特别看别人滴代码,又特别针对新人,但请你忍耐一下,看完这两个单独案例。 这两个个代码的功能一样,都是间断打印1、2、1、2……间隔1秒。 代码1: public class Out...
  • cnmm22
  • cnmm22
  • 2015-03-15 05:24:50
  • 1173
收藏助手
不良信息举报
您举报文章:java 对象的wait/notify详解
举报原因:
原因补充:

(最多只允许输入30个字)