2016-11-28 8 views
0

私は1000 * 1000のテーブルとそれに取り組んでいるいくつかのスレッドを持っています。各スレッドは、テーブルの特定の部分で独立して動作し、 "作業"は各繰り返しでテーブル上を移動します。Javaでの複数スレッドアクセス

他のスレッドが待機している間にスレッド全体のテーブルをロックするのではなく、スレッドごとに必要なセルだけをロックしたいと思います。 私は、スレッドごとに必要な "ブロック"のセルをロックしようとしています。

私の考えは、Lock [][]gridLock=new Lock[1000][1000];のようなロックテーブルを作成し、各スレッドに必要なセルをロックすることです。

これは、必要なセルをロック/アンロックする方法として、gridlock(x,y,diameter)gridUnlock(x,y,diameter)と一緒に使用されます。

これを達成するより良い方法はありますか、またはこの方法は適切ですか?

+1

もちろん、スレッドが何をしているのかをはっきりと述べるべきです。すべてのスレッドがテーブルの1つの行で動作するようにしてください。 – luk2302

+1

百万のロックはおそらくかなり煩雑になるでしょう。 – Kayaman

+1

広すぎます。アクセスパターン、アクセスコスト、そしてどのような種類のデータ構成 "テーブル"があるかについて詳しく説明します。あなたのテキストはテーブルではなく*配列*または*グリッド*を示唆しています。また、アクセスタイプ(読み取り/書き込み)を決定することも非常に重要です。あなたの100万ロックのアプローチは、おそらく恐ろしく実行され、シングルスレッド化がより高速になるでしょう。その巨大なデッドロックの可能性はもちろんですが。ロックは、より適切なデータ構造を選択するだけで回避できます。 TL; DR:倉庫にはたくさんのツールがありますが、問題を知らずに良い選択をすることはできません。 – Durandal

答えて

0

単一のオブジェクトに対する同時アクセスは、大量の問題を引き起こす可能性があるため、お勧めしません。最大のものは、スレッドがスレッドを処理している間にオブジェクトが状態を変更できるため、他のスレッドを混乱させる可能性があります。

可能であれば、各スレッドは独自のオブジェクトで動作し、テーブルごとにすべてのスレッドが完了したら最終的なテーブルを作成します。これにより、すべてのスレッドが分離され、不要な並行性の問題が回避されます。

上記の方法が実現できない場合。スレッドを可能な限り独立させ、できるだけテーブルデータを分離しようとします。各スレッドにテーブル内の一連の行を渡してください。これにより、スレッドはテーブルの同じ部分を変更することはありません。次に、各スレッドは、割り当てられた行のセルを変更することができます。

+3

'volatile 'のテーブルオブジェクトは、その"セル "ではなくテーブルの参照にのみ適用されるため、あまり役に立たないでしょう。 – Kayaman

+0

@Kayaman私はオブジェクトが揮発性であることを示唆していました。なぜなら、異なるスレッドによって変更される可能性のある2つのオブジェクトがCPUメモリ内に存在する可能性があるからです。 。 –

+0

可視性の問題があるかもしれませんが、それは非常に面倒なコードを意味します。表がすべてのスレッドに適切に表示されるならば、「揮発性」の必要はありません。 – Kayaman

0

ありがとうございました!
私が推測した方法が正しいかどうかはわかりませんが、それは私がやったことです:
私は私のロックマトリックスが好きです:Lock [] [] gridLock = new Lock [1000] [1000]。 (Xを

public void lockAround(x, y, diameter){ 
[...] 
for{for{ //i and j <1000 
    gridLock[i][j]=new ReentrantLock(); 
    gridLock[i][j].lock(); 
}} 
} 


と私はunlockAroundでロック解除時にnullにそれらを設定します。

しかし、その代わりに全体1millionsの初期化が始まりu_uにロックし、同様に必要な場合にのみ、私は、のようなものを、それを行います、y、直径)法である。

+0

テーブルと同じ並行性の問題があるため、これは正しくありません。 –

関連する問題