dosync
synchronized
完全に異なる並行性の抽象化へのアクセスを提供します。
synchronized
ロックを取得および解放する方法です。スレッドがsynchronized
ブロックに入ると、適切なロックを取得しようとします。ロックが現在別のスレッドによって保持されている場合、現在のスレッドはブロックされ、ロックが解放されるのを待ちます。これにより、デッドロックのリスクなどの特定の問題が発生します。スレッドがsynchronized
ブロックを離れると、ロックが解除されます。
dosync
トランザクションで実行されるコードのブロックをマークします。Clojureのトランザクションは、Refs(ref
関数で作成されたオブジェクト)への変更を調整する方法です。Clojureの可変状態の一部を一貫して表示するためのコードが必要な場合(場合によってはそれらを変更する場合)、それらをRefsに配置し、トランザクションでコードを実行します。
トランザクションには、特定の最大再試行回数(現在は10000にハードコードされている)まで、何らかの理由でコミットできない場合に再起動するという興味深い特性があります。トランザクションがコミットできない理由として考えられるのは、世界の一貫したビューを取得できないことです(実際には、関連する参照-「適応型の履歴」機能があり、これにより、見た目よりも問題が少なくなります。一目); 他のトランザクションによって行われた同時変更。等
トランザクションはデッドロックのリスクを負いません(プログラマーがJava相互運用機能を介してSTMシステムに関係のないデッドロックを導入するために邪魔にならない限り)。一方、livelockは、可能性は低いですが、特定の可能性があります。一般的に、すべてではありませんが、多くの人がいます。--プログラマーがデータベーストランザクションに関連付ける直感のうち、Clojureを含むSTMシステムのコンテキストで有効です。
STMは大きなトピックです。ClojureのSTMについて学ぶための優れたリソースの1つは、MarkVolkmannのSoftwareTransactionalMemoryの記事です。最後のセクションでClojureのSTMについて詳しく説明しますが、最初の部分は入門書として役立ちます。
dosync
引用したスニペットに関しては、ブロックはほとんどの場合副作用がないはずなので、実際には本番コードで通常エミュレートしたいものではありません。ここはprint
STMの内部動作を示すのに役立ちますが、トランザクションで実際のコードに副作用を引き起こす場合は、その目的のためにClojureエージェントを生成する必要があります(トランザクションの場合にのみタスクを実行します)正常にコミットします)。