0

私は、マルチスレッド プログラムを扱う必要がある学校向けの Java プロジェクトに取り組んでいます。基本的に同時アクセスを管理する必要がある値のマトリックスである多くのスレッド間で共有されるクラスが必要です。それは次のようになります。

public class CacheMatrix{
private MyType[][] cachedItems;

public CacheMatrix(int size){
    this.cachedItems = new MyType[size][size];
}
public MyType readItem(int x, int y){...}
public void storeItem(int x, int y, MyType item){...}
}

各項目に 1 つずつ、ReentrantReadWriteLock のマトリックスを使用してそれを管理しようとしていましたが、マトリックスのサイズが約 10^3 X 10^3 であることに気付きました。

これが進むべき道だと思いますか?(そんなに多くのロックを作成しても大丈夫ですか?)

このクラスを使用するスレッドの数が少数の N (N の範囲は 2 から 8) に制限されていることを考慮して、最小の相互排除のみを保持し、ロックの使用を減らすより良い方法を見つけることができますか?

ご支援ありがとうございます!

4

4 に答える 4

1

ロックの数を減らしながらパフォーマンスを維持するために、ロック ストライピングの実装を検討することもできます。

mylockscount = min(concurrencylevel, size) 基本的に、ロックを保持する内部配列が作成されます。読み取り/書き込み操作が発生するたびに、たとえばロックしますmylocks[somehashfunction(x, y) % mylockscount]

このように、ロックの数は、マトリックスのサイズではなく、同時スレッドの数にのみ比例する必要があります。

于 2013-05-28T21:55:01.887 に答える
0

次の 2 つのシナリオが考えられます。

1) シングルロックを使用します。少し素朴ですが、問題を解決するかもしれません。

2) ROWS または COLUMNS のみをロックします。ランダムに一度に 1 つの項目にマトリックスにアクセスする場合は、これでうまくいくはずです。

public class CacheMatrix
{
    private MyType[][] cachedItems;

    public CacheMatrix(int size) {
        this.cachedItems = new MyType[size][size];
    }

    public MyType readItem(int x, int y) {
        synchronized (cachedItems[x]) {
            return cachedItems[x][y];
        }
    }

    public void storeItem(int x, int y, MyType item) {
        synchronized (cachedItems[x]) {
            this.cachedItems[x][y] = item;
        }
    }
}
于 2013-05-28T21:33:07.723 に答える