A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 齐伟超 中级黑马   /  2015-8-31 19:56  /  194 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

线程1锁定并判断A的状态后需要获得B的锁,线程2锁定并判断B的状态后需要获得A的锁,两线程同时发生,如何避免死锁?

中间的"判断状态后获得..."并不是废话,因为获得第二个锁的事件可能不会发生,也可能会发生。

比方说,账户A与账户B互为关联,若A余额不足,则从B中支取,若B余额不足则从A中支取。某一时刻,A与B同时消费,然后都发现自己余额不足,这种情况下的死锁问题如何避免?
个人想法:
① 如果不需要先判断状态(必然获得第二把锁)的话,我们可以通过账号id的大小来重新安排请求锁的顺序,以避开死锁。针对此问题,可以忽略判断条件,无论是否需要使用第二把锁,都按照顺序将两个对象锁上。这种方案是不是太粗暴了?
② 如果使用java的话,concurrent包中Lock对象有tryLock功能,但是这种方案使用的是语言特性,不知这种特性是否在各种语言中普遍存在?我期待的是一种解决思想,最好与语言无关。

1 个回复

倒序浏览
不可能同时发现,CPU在某一时刻,只能执行一条指令。你判断发现余额不足的时候,只能先判断一个。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马