2

本当に何も思いつかない

ひとつ考えられるのは

@synchronized (self)
{
@synchronized (self){}
}

ただし、ロックは再帰的であり、同じスレッドが通過できるようにするため、これはデッドロックしません。したがって、プログラム全体で1つの変数のみを使用する場合、基本的にデッドロックすることはできません

私が考えることができるもう一つは

@synchronized (A)
{
@synchronized (B){}
}

1 つのスレッドで

@synchronized (B)
{
@synchronized (A){}
}

別の。私はここで正しいですか?

デッドロックを回避する方法は?簡単なルールは?

4

2 に答える 2

4

私の一番のルールは、公開されているものは決してロックしないことです。
私の 2 番目のルールは、ロックを保持している間は決して外部コードを呼び出さないことです。

この 2 つのポイントを管理できれば、発生する可能性のあるデッドロックをはるかに見つけやすく、修正しやすいことがわかりました。

于 2012-05-22T16:53:54.277 に答える
1

共有リソースがある場合に並行性を使用する場合、簡単なことは何もありません。常にデッドロックのリスクがあり、非原子性によるデータ破壊のリスクが常にあり、完全に並行して有効化されたコードがすべてのロックのためにシングルスレッドコードよりも遅くなるリスクが常にあります。

「最良の」パターンは分離です。クロススレッド/キューレイヤーを可能な限り小さくし、その背後にあるすべてのものを単一のスレッドに分離します。

CoreDataはこのパターンの良い例です。管理対象オブジェクトのコンテキストはスレッドごとであり、CDは、非常によくユニットテストされたインフラストラクチャを介して、完全にバックグラウンドで同時データストレージを管理します。

于 2012-05-22T16:56:25.720 に答える