私は並行処理のプログラミングに錆びており、誰かが私が評価している並行処理パターンについていくつかの洞察を提供できることを願っています。同時実行パターン:特定の条件の下でブロックと非ブロックを切り替えるオブジェクト
アイデアは、大部分の時間、ノンブロッキングモードで動作するオブジェクトがあることです。しかし、ある条件下では、オブジェクトが同期して動作することを要求するメソッドが呼び出されます。
以下は、問題を説明するために私がスケッチしたJavaコードのサンプルです。
考えられるのは、複数のスレッドがSyncMethod()というこの1つのメソッドを除いて、このオブジェクトのすべてのメソッドを安全に呼び出すことができるという考えです。このメソッドは特定の条件の下で呼び出され、このような場合は、スレッドを同期クリティカルコードパスにリダイレクトする必要があるSyncAsyncMethod()などのメソッドがあります。これを容易にするために、状態を追跡するための原子変数と、非同期セクションで実行されるスレッドの数を格納します。
私は同時実行プログラミングを行っているので、しばらく経っています。論理を複雑にすることや競合状態を見落としている場合は、教えてください。
また、すべての方法を同期させるよりもパフォーマンスを向上させるには、このすべてのロジックが価値があるとも考えています。 Atomic変数のチェックが高価であるかどうかは誰にも分かりますか?
最後に、このパターンの名前があるかどうかわかりますか?
おかげで、あなたが読んだとき {
private AtomicBoolean mSyncMode;
private AtomicBoolean mOutOfAsyncZone;
private AtomicInteger mAsyncThreads;
public MyObject()
{
mSyncMode.set(false);
mOutOfAsyncZone.set(false);
mAsyncThreads=0;
}
//this method must always run synchronized...
public synchronized void SyncMethod()
{
if(!mSyncMode.get())
SetSyncMode(true);
if(mSyncThreads > 0)
wait();
//do stuff....
SetSyncMode(false);
}
//this method is used to toggle this object between sync and async mode.
public void SetSyncMode(boolean b)
{
mSyncMode.set(b);
}
public void DoStuff()
{
//do stuff...
}
public void DoOtherStuff()
{
}
//this method can run safely
public void SyncAndAsyncMethod()
{
if(mSyncMode.get())
{
synchronized(this)
{
if(mAsyncThreads > 0)
wait();
DoStuff();
}
}
else
{
mAsyncThreads++;
DoStuff();
mAsyncThreads--;
if(mSyncMode.get() && mAsyncThreads <= 0)
{
synchronized(this)
{
notifyAll();
}
}
}
}
}
ディラン、私は書式を編集して修正しようとしましたが、少なくとも6つの空白以外の文字である必要があります。最初と最後の行を4スペース分インデントします。 – Brady
この質問は[コードレビュー](http://codereview.stackexchange.com/)に適しています。 – assylias
私はEclipseでインデントを修正しました...私はもともとテキストパッドでこれをハッキングしました。 –