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

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

1、文档线程模型

2、Java Monitors中的陷阱

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

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

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

3、触发死锁的条件

    满足以下4个条件,会触发死锁:

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

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

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

    4)可以获取多个资源

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

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



你可能感兴趣的:(api)