zoukankan      html  css  js  c++  java
  • 多线程---等待唤醒机制

    线程执行当中,线程是放在线程池中的。 

    线程运行当中通常使用了wait()方法等待的话,再使用notify()唤醒线程,通常唤醒的是线程池中等待的第一个线程。

    而用notifyAll()则是唤醒全部线程 。

    以上三种红字的方法:

    wait()、notify()、notifyAll()必须使用在同步synchronized中

    因为对持有监视器(锁)的线程才能操作。

    注意:

    这三种方法 wait()、notify()、notifyAll()是定义在java.lang.Object这个父类当中的,线程是从这继承来的。

    为什么要定义在父类java.lang.Object中呢?

    是因为在操作线程时候,必须要标示他们操作线程锁持有的“锁”,只有同一个锁的等待线程 ,可以被notify()唤醒。

    而“锁” 可以是任意对象,所以可以被任意对象调用的方法定义在Object中。

     当用生产者消费者的这种模式的时候,也就是多个线程同时“生产”、“消费”

    要注意两点:

    要用while循环判断代替if判断,这样就不会出现已经判断了的等待线程再次获得执行资格时,会再次判断是否满足条件,这样生产者(消费者)就会全部等待;

    要用notifyAll来全部唤醒,如果只用notify那么就有可能只唤醒本方的线程(上一个条件会使对方全部等待),对方的不会被唤醒,这样才不会出现死锁的现象;

     JDK1.5之后提供了多线程的解决方案

    将同步中的synchronized操作替换成了显示的Lock

    Object中的waite,notify,notifyAll对象,替换成了Condition

    这个对象可以Lock锁   进行获取

     

  • 相关阅读:
    服务级后门自己做——创建服务
    使用Win32创建串口通讯程序
    LoadImage with resource 出现未定义
    direct path write等待事件
    enq: TX row lock/index contention、allocate ITL等待事件
    enq: TT contention等待事件
    enq: TM contention等待事件
    enq: RO fast object reuse等待事件
    direct path write temp等待事件
    enq: US contention等待事件
  • 原文地址:https://www.cnblogs.com/kevinfuture/p/4285377.html
Copyright © 2011-2022 走看看