【Practical API Design学习笔记】同步与死锁

    像Java这类语言,写多线程是很常常的事情,可是在多线程中,可以保证在不一样环境中都不死锁是很是不容易的。没有一种方法可以保证不死锁,可是一些设计模式和建议对此多是有用的。 java

一、文档线程模型 设计模式

二、Java Monitors中的陷阱 多线程

    设计Monitors模型时没有继承机制。而Java有继承机制,Java的多线程用的是Monitors模型,所以当父类某处用了同步锁,而子类不知道,子类也用了同步锁,就变成了死锁。 线程

    为了解决这个问题,对于公开的API的类,不能将其对外方法声明为同步。不让别人知道你的API中哪里使用了同步。由于用户也许仍然会相信Java的同步是基于Monitor机制的,因此他们能够随意向Java类中添加本身的同步方法。能避免这种状况的惟一办法是提供下面代码所示的内部锁,固然使用java.util.concurrent包中提供的相似的锁功能也是能够的。 设计

三、触发死锁的条件 继承

    知足如下4个条件,会触发死锁: 资源

    1)互斥条件,只有一个线程能访问某个资源 开发

    2)无优先级调度,一个资源被占用,没有办法强行释放该资源 文档

    3)持有和等待条件,即无限期地持有或者等待某个资源 同步

    4)能够获取多个资源

    只要破坏上述条件中的某一个,死锁就被破坏。可是这不是容易的,迄今为止,还未找到某个静态的方法,可以检测出存在死锁的状况。

    基本的建议对于开发人员是:使用外部代码时,不要采用锁。

相关文章
相关标签/搜索