去故就新 Java线程新同步机制

发表于:2011-11-29 10:07

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:yuyiming1986    来源:51Testing软件测试网采编

  输出:

WorkerTwo:setp into critical section
WorkerTwo:call sayHello()
WorkerOne:step into critical section

  2、条件对象Condition,相当于wait-notify机制,提供一种线程间的等待通知机制,condition中的等待-通知方法是await(),signal(),signalAll(),也需要在互斥环境下被调用。

  (1)相关的接口

  创建Condition对象,Condition对象是跟Lock关联在一起的。

  • Lock locker = new ReentrantLock(); 
  • Condition cond = locker.newCondition();
  •   把此线程放到条件的等待集中。

    void await();

      解除此条件的等待集中所有线程的阻塞状态。

    void signalAll();

      在此条件的等待集中随机选择一个线程,解除其阻塞状态。

    void signal();

      (2)使用的基本结构:

  • //初始时ok_to_proceed为false. 
  • locker.lock() 
  • try
  •      while(!ok_to_proceed){ 
  • //进入等待此条件集中,被阻塞,它维持状态直到另一个线程调用同一个条件上的。 
  • //signalAll/signal方法时为止。 
  •        cond.await(); 
  •      } 
  • }finally
  • cker.unlock(); 
  • }
  • locker.lock(); 
  •    try
  •       //调用将解除所有等待此条件下的线程的阻塞状态。当线程从等待集中被移走时,它们将再次成为可运行的,调度器将再次激活它们     
  •       //此时,它们将试图重新进入对象。一旦锁可获得,它们中的某个线程将从await调用返回,从而获得锁并从它被阻塞的地方继续执行。 
  •       ok_to_proceed = true
  •       cond.signalAll() or cond.signal(); 
  •    }finally
  •        locker.unlock(); 
  •    }
  •   ok_to_proceed也是为了防止wait-notify出现的问题,即再wait之间,notify()已经给出通知,此时wait只会一直等待下去,这样就保证了signal()线程的通知被await()线程接收到。

    52/5<12345>
    《2023软件测试行业现状调查报告》独家发布~

    关注51Testing

    联系我们

    快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

    法律顾问:上海兰迪律师事务所 项棋律师
    版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
    投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

    沪ICP备05003035号

    沪公网安备 31010102002173号