「ダブル・チェック・ロッキング」を編集中
ナビゲーションに移動
検索に移動
この編集を取り消せます。 下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。
最新版 | 編集中の文章 | ||
1行目: | 1行目: | ||
− | '''ダブル・チェック・ロッキング''' | + | '''ダブル・チェック・ロッキング'''(英語:Double Check Locking)とは、初回は[[ロック]]なしで状態チェックを行い、そこで必要であれば再度[[ロック]]を掛けたのちに状態チェックを行うという[[ソフトウェア]]の[[最適化]]技法、[[デザインパターン]]のひとつである。 |
+ | |||
+ | [[ロック]]は非常に[[オーバーヘッド]]の大きい重い処理であるため、その発生回数を可能な限り減らすことで高速化を実現しようというものである。 | ||
− | |||
ダブル・チェック・ロッキングは、主に[[マルチスレッド]]環境下での[[シングルトンパターン]]を実装する際に[[オーバーヘッド]]の低減を目的として使われることが多い。 | ダブル・チェック・ロッキングは、主に[[マルチスレッド]]環境下での[[シングルトンパターン]]を実装する際に[[オーバーヘッド]]の低減を目的として使われることが多い。 | ||
− | |||
− | |||
− | |||
− | |||
== 主なプログラミング言語での実装例 == | == 主なプログラミング言語での実装例 == | ||
26行目: | 23行目: | ||
public static MySingleton GetInstance() | public static MySingleton GetInstance() | ||
{ | { | ||
− | // | + | // 1回目のチェック |
− | // | + | // ロックしていないので高速に処理される |
if (null == _instance) | if (null == _instance) | ||
{ | { | ||
// ロック | // ロック | ||
− | // | + | // ※このブロック内はクソ重い |
lock (_sync) | lock (_sync) | ||
{ | { | ||
− | // | + | // 2回目のチェック |
if (null == _instance) | if (null == _instance) | ||
{ | { | ||
47行目: | 44行目: | ||
=== C# (Lazy) === | === C# (Lazy) === | ||
− | [[.NET Framework 4.0]] | + | [[.NET Framework 4.0]]では、標準でLazy<T>クラスが用意されており、それを使うことでよりシンプルにダブル・チェック・ロッキングを記述できるようになった<ref>{{cite book |
|title=C# 4.0 in a Nutshell | |title=C# 4.0 in a Nutshell | ||
|last=Albahari | |last=Albahari | ||
57行目: | 54行目: | ||
|chapterurl=http://www.albahari.com/threading/part3.aspx#_LazyT | |chapterurl=http://www.albahari.com/threading/part3.aspx#_LazyT | ||
|quote=<code>Lazy<T></code> actually implements […] double-checked locking. Double-checked locking performs an additional volatile read to avoid the cost of obtaining a lock if the object is already initialized. | |quote=<code>Lazy<T></code> actually implements […] double-checked locking. Double-checked locking performs an additional volatile read to avoid the cost of obtaining a lock if the object is already initialized. | ||
− | }}</ref | + | }}</ref>。 |
この記述方法は[[C Sharp|C#]]に依存した機能も特に使われておらず、[[.NET Framework]]系の様々な[[プログラミング言語]]へも特に悩むことなく移植・実装可能であると思われる。 | この記述方法は[[C Sharp|C#]]に依存した機能も特に使われておらず、[[.NET Framework]]系の様々な[[プログラミング言語]]へも特に悩むことなく移植・実装可能であると思われる。 | ||
<source lang="csharp"> | <source lang="csharp"> | ||
− | |||
− | |||
public class MySingleton | public class MySingleton | ||
{ | { | ||
− | private static readonly Lazy<MySingleton> _instance | + | private static readonly Lazy<MySingleton> _instance = |
− | + | new Lazy<MySingleton>(() => new MySingleton()); | |
private MySingleton() | private MySingleton() | ||
75行目: | 70行目: | ||
return _instance.Value; | return _instance.Value; | ||
} | } | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
</source> | </source> | ||
131行目: | 80行目: | ||
== 参考文献 == | == 参考文献 == | ||
{{reflist}} | {{reflist}} | ||
+ | |||
+ | == 外部リンク == | ||
+ | |||
{{stub}} | {{stub}} |