c3 Threads - Deadlock

来源:互联网 发布:手机限制安装软件 编辑:程序博客网 时间:2024/06/03 20:17

Deadlock 

同步导致的另一个问题就是死锁!死锁发生在2个线程都需要同样的资源,但各自拥有一部分子资源的锁,如果谁也不放弃自己持有的锁的话,那2个线程就处于一直等待状态。


比如,Jim和Jerry去图书馆借书A和B完成论文,结果Jim拿到了书A,Jerry拿到了书B,结果谁也不想放弃自己现在有的书,结果2个人的论文都没完成。


更糟糕的是,deadlock会导致不定时的,难以发现的bug。还以上例来说,如果Jim或者Jerry有一个先到,拿到了2本书,论文完成后,还书,然后另一个拿到书完成论文。可是,但2个人同时来借书时就出现问题了!可能99%的情况下,程序都正常执行,只有1%的情况下“无原因”的hang。然而,一个每秒处理成百上千个请求的多线程web服务器,即使一个百万分之一概率的问题也能导致服务器短时间内hang。


避免死锁的最重要的技术就是避免使用synchronization,如果可以使用其他技术达到安全就不使用synchronization,synchronization应该作为最后的实现线程安全的措施。若必须使用synchronization,那要时同步的代码块尽量小,作为锁的对象要是同一个。


通常情况下,你最好是做到仔细考虑你的代码,看是否会造成死锁!如果多个类需要同样的资源集,那就保证他们请求资源的顺序是一样的!比如如果类A和类B需要资源X和Y,那就规定A、B要先请求X,再请求Y,在没有拿到X前不会拿Y,那就不会导致死锁了!


0 0
原创粉丝点击