快速业务通道

关于解决Java编程语言线程问题的建议 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
new Object();    Object lock2 = new Object(); void a()    {  synchronized( lock1 )      {  synchronized( lock2 )        {  // do something        }      }    } void b()    {  synchronized( lock2 )      {  synchronized( lock1 )        {  // do something        }      }    }

关于解决Java编程语言线程问题的建议(5)

时间:2011-01-24 Allen Holub

设想一个线程调用 a() ,但在获得  lock1 之后在获得 lock2 之前被剥夺运行权。 第二个线程进入运行,调用 b() ,获得了 lock2 ,但是由于第一个线程占用 lock1 ,所以它无法获得 lock1 ,所以它随后处于等待状态。此时第一个线程被唤醒,它试图获得 lock2 ,但是由于被第二个线程占据,所以无法获得。此时出现死锁。下面的 synchronize-on-multiple-objects 的语法可解决这个问题:

//...    void a()    {  synchronized( lock1 && lock2 )      {      }    }    void b()    {  synchronized( lock2 && lock3 )      {      }    }

编译器(或虚拟机)会重新排列请求锁的顺序,使 lock1 总是被首先获得,这就消除了死锁。

但是,这种方法对多线程不一定总成功,所以得提供一些方法来自动打破死锁。一个简单的办法就是在等待第二个锁时常释放已获得的锁。这就是说,应采取如下的等待方式,而不是永远等待:

while( true )    {  try      {  synchronized( some_lock )[10]        {  // do the work here.        break;        }      }      catch( TimeoutException e )      {  continue;      }    }

如果等待锁的每个程序使用不同的超时值,就可打破死锁而其中一个线程就可运行。我建议用以下的语法来取代前面的代码:

synchronized( some_lock )[]    {  // do the work here.    }

synchronized 语句将永远等待,但是它时常会放弃已获得的锁以打破潜在的死锁可能。在理想情况下,每个重复等待的超时值比前一个相差一随机值。

改进 wait() 和 notify()

wait() / notify() 系统也有一些问题:

无法检测 wait() 是正常返回还是因超时返回。

无法使用传统条件变量来实现处于一个“信号”(signaled)状态。

太容易发生嵌套的监控(monitor)锁定。

超时检测问题可以通过重新定义 wait() 使它返回一个 boolean 变量 (而不是 void ) 来解决。一个 true 返回值指示一个正常返回,而 false 指示因超时返回。

基于状态的条件变量的概念是很重要的。如果此变量被设置成 false 状态,那么等待的线程将要被阻断,直到此变量进入 true 状态;任何等待 true 的条件变量的等待线程会被自动释放。 (在这种情况下, wait() 调用不会发生阻断。)。通过如下扩展 notify() 的语法,可以支持这个功能:

notify(); 释放所有等待的线程,而不改变其下面的条件变量的状态。
notify(true); 把条件变量的状态设置为 true 并释放任何等待的进程。其后对于wait()的调用不会发生阻断。
notify(false); 把条件变量的状态设置为 false (其后对于wait()的调用会发生阻断)。

关于解决Java编程语言线程问题的建议(6)

时间:2011-01-24 Allen Holub

嵌套监控锁定问题非常麻烦,我并没有简单的解决办法。嵌套监控锁定是一种死锁形式,当某个锁的占有线程在挂起其自身之前不释放锁时,会发生这种嵌套监控封锁。下面是此问题的一个例子(

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号