当前位置: 技术问答>linux和unix
死锁的问题 多级锁定问题 循环锁定问题
来源: 互联网 发布时间:2015-10-25
本文导语: 比如 有个golean 对象 group 对象 1 group 对象 2 group 对象 3 user 对象1 in group 1 user 对象2 in group 1 user 对象3 in group 1 是一个三级的对象 golean 是全局的 下面有很多 group group 里面有很多user ...
比如 有个golean 对象
group 对象 1 group 对象 2 group 对象 3
user 对象1 in group 1
user 对象2 in group 1
user 对象3 in group 1
是一个三级的对象 golean 是全局的
下面有很多 group
group 里面有很多user
那么gloean 操作 的时候 先锁 golean
然后进group 再锁 group
进user 再锁定 user
这个顺序没有问题
问题是 如果在user 操作的时候 需要获取 其他group 的资源
或者获取golean 资源的时候
它需要调用golean 的一个方法
那么就是一个反相调用了
如果user 在本身被调用的时候
golean 已经锁定了 那么这时候会死掉
如何避免这种情况呢?
如果采取回避的方法 也不行啊 因为这是自己和自己竞争啊
我考虑在user 需要需要获取 其他group 的资源
或者获取golean 资源的时候
先不锁定自己 先获取其他的资源 再锁定自己
但是仍不能保证调用user的时候 golean 没有被锁定啊
是否整体设计有问题?
或者这种情况下 必须把所有必须的资源 作为参数传给下一级对象
下一级对象完全不需要向上申请资源资源?
group 对象 1 group 对象 2 group 对象 3
user 对象1 in group 1
user 对象2 in group 1
user 对象3 in group 1
是一个三级的对象 golean 是全局的
下面有很多 group
group 里面有很多user
那么gloean 操作 的时候 先锁 golean
然后进group 再锁 group
进user 再锁定 user
这个顺序没有问题
问题是 如果在user 操作的时候 需要获取 其他group 的资源
或者获取golean 资源的时候
它需要调用golean 的一个方法
那么就是一个反相调用了
如果user 在本身被调用的时候
golean 已经锁定了 那么这时候会死掉
如何避免这种情况呢?
如果采取回避的方法 也不行啊 因为这是自己和自己竞争啊
我考虑在user 需要需要获取 其他group 的资源
或者获取golean 资源的时候
先不锁定自己 先获取其他的资源 再锁定自己
但是仍不能保证调用user的时候 golean 没有被锁定啊
是否整体设计有问题?
或者这种情况下 必须把所有必须的资源 作为参数传给下一级对象
下一级对象完全不需要向上申请资源资源?
|
感觉你整体设计有问题,先有问题然后有模型,不见你的问题只见你的模型,还规定的死死的,不死才怪!
|
你好像对原子锁没有兴趣,Group, Gloeal,都是依赖于user的,那么只要锁定user就可以了,Group, Gloeal对于特定部分加以锁定就可以了是不是?比如它的名字,数量等信息,一访问完了这些属性就可以释放它了。我认为Group, Gloeal 它有很多属性是全局的,你只要锁定它的私有部分就可以了。更具体的锁定交给具体对象去做,比如实际的USER,它会自己管理。