事件的次序如下
首先thread 启动并对theobject步阻止任何其他线程对theobject调用任何方法
然后thread i调用sleep()使thread可以启动
thread启动并对theOtherObject同步阻止任何其他线程对theOtherObject调用任何方法
然后thread用sleep()允许thread再次运行
threadl醒来并试着对theOtherObject用methord(}但必须等到对theOtherObject同步的thread中的代码完全执行完后才可以调用
再次运行thread因为threadl不能继续并试着调用theObject的method()直至thread 的代码块完成执行过程才能继续threadl ()是与theObject同步的
任何线程不可能继续进行杯去发生了死锁发现并纠正这类问题非常困难特别是如果你的程序很复杂并且有将继续执行的其他线程时
在最后的例子中通过对main()的for循环中对一个账户设置同步你也可以创建一个无价值的死锁例如
synchronized accounts[]){
for(int i=;i<=transactionCount;i++)
{
//code for generating transactions etc
}
}
一但accounts[]出现一个交易死锁就会发生因为在theBank对象中用于处理交易并由一个Clerk对象调用的doTransaction()方法将针对同一对象同步并直到循环结束才能执行当然直到theBank对象中的方法结束循环才能继续所以程序挂起
通常确保你的程序没有潜在的死锁非常困难如果你打算用线程编写大量程序你需要比我们这里研究得更深入细致这个方面的一本好书是由Doug Lea编写的<《java并行编程设计原理和模式》(ISON)
[] [] [] [] [] [] [] [] []