同步语句块
另外为了对一个类对象能同步方法你也可以在你的程序中将一条语句或代码块指定成synchronized这个功能非常强大由于你指定的是哪一特定对象受益于语句或代码块的同步而不只是包含一个同步方法的代码的对象的同步这里我们可以为了一个给定的语句块对任何一对象设置一把锁当针对一个给定的对象同步的块正在执行时针对同一对象同步的其他代码块或方法不叫以执行为了同步一个语句你只需写成
sychronized(theobject)
statement; //synchronized with respect to theobject
程序中当这个语句正在执行时针对对象thObject同步的其他语句或语句块不可以执行当然当一条语句调用一个方法该方法又依次调用其他方法时仍然如此这里这条语句同样可以是个很好的在括号间的代码块这是很有用的成分当这个正在工作的代码块正在运行时我们可以锁住一个特定的对象
为了看看在实际中如何使用让我们对最后的例了建立修改版木为了支持多个账户让我们增加银行操作的复杂性为了扩展我们的例子处理多个账户我们只需要对main()做些改变为了保持输出不太多我们将添加一个额外的账户但为了能处理任何数量我们将修改代码
死锁
由于实际上你可以在你的程序巾任何地方为特定的对象设置同步代码块有的非常令人讨厌的出错状态叫做死锁(deadlock)这包括在两个线程间的相互依赖出现这种情况的一种情形是当一个针对一个给定的对象比如说是theObject的一个线程执行同步代码然后需要针对另一个对象比如说是theObject执行包含代码的另一个方法虽然在这件事发生前第二个线程theOtherObject执行一些同步代码并需要执行包含对第一个对象theObject同步的代码的方法这里这种情况如下图所示
[] [] [] [] [] [] [] [] []