代码改变世界

关于锁

2017-10-13 17:05  alapha  阅读(214)  评论(0编辑  收藏  举报

理论上QUEUE不可能死锁,因为你读写的时候自动加Q锁,在占有Q锁的期间不可能再申请其它锁
从这方面来讲,QUEUE对使用者来说是原子的

如果真的存在死锁,那必然是其它锁交叉占用死的,与Q锁无关

要看为何阻塞,先看看阻塞在哪里

建议

另外建议对QUEUE的get和put最好是非阻塞,或者设置一个超时,
超时后可以打印异常信息,应该避免永久阻塞

考虑一种可能的情况

生产者A,消费者B

A生产前先占用锁X,然后PUT(但是队列满了所以阻塞)
B消费前申请锁X,然后GET——但是X申请不到了!被A永久占用

应该避免这种情况,方法是:
1、队列操作不要长时间阻塞,(用非阻塞或设置短超时)
2、避免队列操作时占用其它锁