我真的想不出任何
我能想到的一件事是
@synchronized (self)
{
@synchronized (self){}
}
但是这不会死锁,因为锁是递归的,并且只允许相同的线程通过。所以基本上你不能死锁,如果整个程序你只使用一个变量
我能想到的另一个是
@synchronized (A)
{
@synchronized (B){}
}
在一个帖子中
@synchronized (B)
{
@synchronized (A){}
}
另一个。我在这里纠正吗?
如何避免死锁呢?任何简单的规则?
答案 0 :(得分:4)
我的#1规则永远不会锁定任何公开可见的内容 我的#2规则永远不会在持有锁的情况下调用外部代码。
我发现如果你可以管理这两点,那么任何可能出现的死锁都更容易被发现并且更容易修复。
答案 1 :(得分:1)
在共享资源中使用并发时,没有什么是简单的;始终存在死锁的风险,始终存在因非原子性而导致数据损坏的风险,并且由于所有锁定,始终存在完全并发启用的代码比单线程代码慢的风险。
“最佳”模式是隔离;使交叉线程/队列层尽可能小,并将其后面的所有内容隔离到一个线程。
核心数据就是这种模式的一个很好的例子。托管对象上下文是每个线程,CD通过一个特别好的单元测试基础架构完全在幕后管理并发数据存储。